Block 的多種使用場景
在對於使用iOS系統的彈框提示UIAlertController框架的時候,發現在多個地方呼叫的時候,會出現很多重複性的程式碼,而且程式碼量不少,於是乎想到要如何封裝UIAlertController,一句程式碼快速開發系統彈框。
類似封裝這種型別,本人總會第一時間想到使用block,由於太久沒有敲程式碼(以前都是按照原有的框架套路程式設計),對於block有點生疏,於是才有了這篇 Block的多種使用場景,對於
UIAlertController的封裝
,請敬請期待。
如果覺得本編內容對你有幫助的,請點個贊,支援一下
(嘻嘻,我很虛榮,有你們的支援我會更積極,寫更多文章)
block基本結構解析(使用三部曲:宣告、賦值、呼叫)
image.png
例項1:加法程式碼塊 //1.0 宣告 int (^plusCountBlock)(int,int); //2.0 賦值 plusCountBlock = ^(int a, int b){ return a+b; }; //3.0 呼叫 NSLog(@"加法計算器:%d",plusCountBlock(1,2)); ///////////////////////////////////縮寫如下////////////////////////////////////// int (^plusCountBlock)(int,int) = ^(int a, int b){ return a+b; }; //////////////////////////////////////////////////////////////////////////////////////
場景一:block 變數
結構格式:
返回值型別(^Block名字)(引數列表);
returnType (^blockName)(parameterTypes) = ^returnType(parameters) {...};
例項2: 備註:在宣告block過程中,重點是確定block的名稱及資料型別(如下所示), 因此在使用block過程中,如果需要宣告多個相同返回值相同引數值列表的block變數, 會使用typedef定義block型別 @interface ViewController () @property (nonatomic,copy) int(^plusCountBlock)(int,int); @end ///////////////////////////////////typedef寫法////////////////////////////////////// typedef int(^PlusCountBlock)(int,int); @interface ViewController () @property (nonatomic,copy) PlusCountBlock plusBlock; @end ////////////////////////////////////////////////////////////////////////////////////// @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //賦值 self.plusBlock = ^int(int a, int b) { return a+b; }; //呼叫 self.plusBlock(1,2); } @end
場景二:block 作為OC方法引數
typedef int(^PlusCountBlock)(int,int); @interface ViewController () @property (nonatomic,copy) PlusCountBlock plusBlock; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //賦值 [self addTwoCount:^int(int a, int b) { return a+b; }]; } /** 作為引數,傳入block程式碼塊,就是為了“呼叫” 如果想要傳入引數,則此block必須要有返回型別 */ - (void)addTwoCount:(PlusCountBlock)block { NSLog(@"====== %d",block(1,2)); } @end
場景三:block 作為OC方法返回值
再次溫馨提醒:
1、宣告block的時候最好不要新增返回引數和引數的名稱,這只是形參,重點是定義引數的資料型別,避免閱讀程式碼造成混亂
2、使用block的時候好好回憶:block的使用三部曲(宣告->賦值->呼叫),你就會使用的很流暢。
#import "ViewController.h" //1.0 宣告 typedef int(^PlusCountBlock)(int,int); @interface ViewController () @property (nonatomic,copy) PlusCountBlock plusBlock; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //2.0 賦值 _plusBlock = [self addTwoCount]; //3.0 呼叫 _plusBlock(1,2); } - (PlusCountBlock)addTwoCount{ return ^int(int a, int b){ return a+b; }; } @end
有好野(高階用法):鏈式程式設計
閱讀後是不是感覺很簡潔,當然同時也會加大閱讀程式碼的難度,不過權衡利弊,在封裝的時候可以選擇性使用
//ViewController.h #import <UIKit/UIKit.h> @class ViewController; typedef int(^PlusCountBlock)(int,int); typedef ViewController *(^AddCountBlock)(int); @interface ViewController : UIViewController /** 求兩個數的和 */ - (PlusCountBlock)addTwoCount; /** 累加 */ - (AddCountBlock)addCount; /** 返回總和結果(同時也是斷開了鏈式程式設計:沒有返回viewController例項物件) */ - (NSInteger(^)(void))returnSum; @end
//ViewController.m #import "ViewController.h" @interface ViewController () @property (nonatomic,assign) NSInteger sum; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (PlusCountBlock)addTwoCount{ return ^int(int a, int b){ NSLog(@"a+b的和:%d",a+b); return a+b; }; } - (AddCountBlock)addCount { return ^ViewController *(int count){ self.sum += count; NSLog(@"累加總和:%d",a+b); return self; }; } - (NSInteger(^)(void))returnSum { return ^NSInteger(){ return self.sum; }; } @end
//使用方式 ViewController *vc = [[UIViewController alloc]init]; vc.addTwoCount(1,2); vc.addCount(1).addCount(2).returnSum();
待續...