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的作為參數使用時的格式,理解起來也很快的,如果先前對這類型的用法在理解上抱有疑惑的話,希望這個小例子能幫到您:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM