zoukankan      html  css  js  c++  java
  • Block作为参数时的使用

    Block作为参数使用,常见于各框架之中,比如在封装一个类时,当做什么事情由外界去决定,什么时候调用由自己的类决定时,这时候就需要将block作为参数使用。


    下面我们模仿AFNetworking的manager,以自定义一个简单的工具类CalculatorManager为例:
    1.CalculatorManager.h文件

    #import <Foundation/Foundation.h>
    
    @interface CalculatorManager : NSObject
    
    /** 计算结果值*/
    @property(assign, nonatomic) int result;
    +(instancetype)sharedCalculatorManager;
    
    //block作为参数时格式与其它类型定义时一致,都是(类型)变量名,看起来有些晕人
    -(void)calculate:(int(^)(int))calculateBlock;
    
    @end
    

    2.CalculatorManager.m文件

    #import "CalculatorManager.h"
    
    static CalculatorManager *instance = nil;
    
    @implementation CalculatorManager
    //单例(可忽略)
    +(instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (instance == nil) {
                instance = [super allocWithZone:zone];
            }
        });
        return instance;
    }
    
    +(instancetype)sharedCalculatorManager
    {
        return [[self alloc] init];
    }
    
    //方法中定义了一个block数据类型参数(返回值为int类型的,且带有一个int类型的形参)
    -(void)calculate:(int (^)(int))calculateBlock
    {
        //calculateBlock接受外界传入的代码块,也就意味着怎么去操作是由外界调用者决定的
        _result = calculateBlock(_result);//将_result的值作为实参传入
    }
    
    @end
    

    3.外界控制器调用

    -(void)viewDidLoad {
        [super viewDidLoad];
        
        CalculatorManager *manager = [CalculatorManager sharedCalculatorManager];
        [manager calculate:^int(int i) {
            //参数i自加1,然后返回
            i++;
            return i;
        }];
        NSLog(@"%d",manager.result);//输出结果为1
    }
    

    可以看到,工具类CalculcatorManager的计算方法calculate:^int(int)calculateBlock其具体实现,交由了外界的控制器调用者去决定了。虽然有些许绕,但只要搞清楚block的作为参数使用时的格式,理解起来也很快的,如果先前对这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

  • 相关阅读:
    FTP解决办法:服务器发回了不可路由的地址。使用服务器地址代替。
    隐藏显示终端的光标(shell echo,linux c printf)
    FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)
    XP使用VNC远程桌面CentOS 6(原创,备忘)
    LINUX命令行技巧
    FTP服务器(vsftpd)配置随笔
    更快、更强 64位编程的三十二条军规
    MFC 程序入口和执行流程
    css实现居中
    treeview控件显示指定目录下的目录和文件
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5149801.html
Copyright © 2011-2022 走看看