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文件atom
#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.外界控制器調用spa
-(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的做爲參數使用時的格式,理解起來也很快的,若是先前對這類型的用法在理解上抱有疑惑的話,但願這個小例子能幫到您:)code