Block:語(yǔ)法塊,,本質(zhì)上是匿名函數(shù)(沒(méi)有名稱的函數(shù)) 標(biāo)準(zhǔn)C里面沒(méi)有Block,C語(yǔ)言的后期擴(kuò)展版本,,加入了匿名函數(shù) 在C++,、JS、Swift等語(yǔ)言有類似語(yǔ)法,,叫做閉包 Block語(yǔ)法和C語(yǔ)言里的函數(shù)指針很相似,,下面我們先來(lái)回顧下C語(yǔ)言中的函數(shù)和函數(shù)指針 C語(yǔ)言中函數(shù)是指:實(shí)現(xiàn)某一功能的代碼段 完整的函數(shù)包括兩部分:函數(shù)聲明、函數(shù)定義 函數(shù)聲明,,即函數(shù)原型,。例如: int sum (int x,int y) ;具有兩個(gè)整形參數(shù),一個(gè)整形返回值的函數(shù) 函數(shù)定義,,即函數(shù)實(shí)現(xiàn),。例如: int sum(int x,,int y){ return x + y,; } 函數(shù)指針(變量):存放函數(shù)地址(函數(shù)名)的指針變量 int(*p)(int x,int )= sum,; 函數(shù)指針類型: int(*)(int x,,int y) 即:指向兩個(gè)整形參數(shù),一個(gè)整形返回值函數(shù)的指針 函數(shù)指針變量: p 函數(shù)指針的值: sum Block 匿名函數(shù):沒(méi)有名稱的函數(shù) 例如: int (int x,,int y) 因?yàn)锽lock是匿名函數(shù),,block變量存放的函數(shù)的實(shí)現(xiàn),通過(guò)block變量能直接調(diào)用函數(shù) Block類型: int (^)(int) Block變量: myBlock Block值: ^int (int num) {return 7*num;} 即:^返回值類型(參數(shù)列表){函數(shù)體}其中返回值類型可以省略 例如:寫(xiě)一個(gè) 返回值為整形 參數(shù)為OC字符串(僅一個(gè)參數(shù))的block,實(shí)現(xiàn)將字符串轉(zhuǎn)換為整形的功能 int (^myBlock)(NSString *) = ^(NSString *string) { return [string intValue]; }; NSLog(@"%d",myBlock(@"123")); block的數(shù)據(jù)類型代表了匿名函數(shù)的格式(返回值類型,,形參的類型) block變量的定義與函數(shù)指針變量的定義類似,,唯一區(qū)別于函數(shù)指針變量的是變量名前通過(guò)脫字符(^)修飾 首先應(yīng)該用^修飾,剩余的部分與C語(yǔ)言函數(shù)定義一致,,最大的不同就是沒(méi)有函數(shù)名(同時(shí)返回值類型也可以省略) block變量在定義時(shí)具有變量定義的基本特征,,賦值號(hào)右側(cè)的匿名函數(shù)可以當(dāng)做一個(gè)整體被賦值,類似于 int a = 5; block變量所賦的值是匿名函數(shù),。又兼具函數(shù)的特征,,并且是唯一可以定義在某個(gè)函數(shù)實(shí)現(xiàn)內(nèi)部(C語(yǔ)言中認(rèn)為函數(shù)是不能嵌套定義的,block是個(gè)特例) Block進(jìn)行typedef typedef int (^BlockType)(int x,int y) 原類型: int(^)(int x,int y) 新類型: BlockType 類比函數(shù)指針的類型定義,,格式與函數(shù)指針一致,,類型定義一定程度上簡(jiǎn)化了block的使用。 typedef int (^SumType)(int,int); SumType sumBlock = ^(int x,int y) { return x + y; }; int result = sumBlock(5,4); NSLog(@"%d",result); __block類型標(biāo)識(shí)可以運(yùn)行局部變量在其后續(xù)定義的block內(nèi)部正常訪問(wèn),, __block int num = 0; void (^testBlock)() = ^() { for (int i = 0; i < 10; i++) { count++; num++; NSLog(@"%d",count); } }; block調(diào)用 testBlock(); 數(shù)組使用Block排序
數(shù)組使用Block對(duì)兩個(gè)字符串進(jìn)行比較 NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) { return [str2 compare:str1]; //如果是升序返回-1,,如果是降序返回1,如果相等返回0 }; NSLog(@"%ld",compareBlock(@"11",@"12"));
NSArray *array = @[@1,@2,@13,@12,@23]; NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)]; NSLog(@"%@",resultArray1); 數(shù)組使用Block排序 降序排列 NSComparator sortBlock = ^(id obj1,id obj2) { return [obj2 compare:obj1]; }; NSArray *resultArray2 = [array sortedArrayUsingComparator:sortBlock]; NSLog(@"%@",resultArray2); 升序序排列 NSArray *resultArray3 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2]; }]; NSLog(@"%@",resultArray3); |
|