中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OC中Block語法、Block使用以及通過Block實現數組排序

發布時間:2020-06-25 18:27:40 來源:網絡 閱讀:587 作者:Running2snail 欄目:開發技術

Block:語法塊,本質上是匿名函數(沒有名稱的函數)

標準C里面沒有Block,C語言的后期擴展版本,加入了匿名函數

在C++、JS、Swift等語言有類似語法,叫做閉包

Block語法和C語言里的函數指針很相似,下面我們先來回顧下C語言中的函數和函數指針

C語言中函數是指:實現某一功能的代碼段

完整的函數包括兩部分:函數聲明、函數定義

函數聲明,即函數原型。例如:int sum (int x,int y);具有兩個×××參數,一個×××返回值的函數

函數定義,即函數實現。例如:int sum(int x,int y){

return x + y;

}

函數指針(變量):存放函數地址(函數名)的指針變量

int(*p)(int x,int )= sum;

函數指針類型:int(*)(int x,int y)即:指向兩個×××參數,一個×××返回值函數的指針

函數指針變量:p

函數指針的值:sum

Block 匿名函數:沒有名稱的函數

例如:int (int x,int y)

因為Block是匿名函數,block變量存放的函數的實現,通過block變量能直接調用函數

Block類型:int (^)(int)

Block變量:myBlock

Block值:^int (int num) {return 7*num;}

即:^返回值類型(參數列表){函數體}其中返回值類型可以省略

例如:寫一個 返回值為××× 參數為OC字符串(僅一個參數)的block,實現將字符串轉換為×××的功能

 int (^myBlock)(NSString *) = ^(NSString *string) {

        return [string intValue];

    };
   
NSLog(@"%d",myBlock(@"123"
));

block的數據類型代表了匿名函數的格式(返回值類型,形參的類型)

block變量的定義與函數指針變量的定義類似,唯一區別于函數指針變量的是變量名前通過脫字符(^)修飾

首先應該用^修飾,剩余的部分與C語言函數定義一致,最大的不同就是沒有函數名(同時返回值類型也可以省略)

block變量在定義時具有變量定義的基本特征,賦值號右側的匿名函數可以當做一個整體被賦值,類似于 int a = 5;

block變量所賦的值是匿名函數。又兼具函數的特征,并且是唯一可以定義在某個函數實現內部(C語言中認為函數是不能嵌套定義的,block是個特例)

Block進行typedef

typedef int (^BlockType)(int x,int y)

原類型:int(^)(int x,int y)

新類型:BlockType

類比函數指針的類型定義,格式與函數指針一致,類型定義一定程度上簡化了block的使用。

    typedef int (^SumType)(int,int);
   
SumType sumBlock = ^(int x,int y) {
       
return x + y;
    };
   
int result = sumBlock(5,4);
   
NSLog(@"%d",result);


 __block類型標識可以運行局部變量在其后續定義的block內部正常訪問,

    __block int num = 0;

   
void (^testBlock)() = ^() {
       
for (int i = 0; i < 10; i++) {
           
count++;
            num++;
           
NSLog(@"%d",count);
        }

    };

block調用

    testBlock();



數組使用Block排序

OC中Block語法、Block使用以及通過Block實現數組排序

數組使用Block對兩個字符串進行比較

    NSComparisonResult (^compareBlock)(NSString *,NSString *) = ^(NSString *str1,NSString *str2) {

        return [str2 compare:str1];

//如果是升序返回-1,如果是降序返回1,如果相等返回0

    };

    NSLog(@"%ld",compareBlock(@"11",@"12"));

OC中Block語法、Block使用以及通過Block實現數組排序


    NSArray *array = @[@1,@2,@13,@12,@23];
   
NSArray *resultArray1 = [array sortedArrayUsingSelector:@selector(compare:)];
   
NSLog(@"%@",resultArray1);


數組使用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);















向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丰都县| 盐城市| 五常市| 甘泉县| 延庆县| 平潭县| 武城县| 孟津县| 崇文区| 三穗县| 凌云县| 漳平市| 太仆寺旗| 苏尼特右旗| 建瓯市| 尼玛县| 新沂市| 山西省| 美姑县| 祁连县| 焉耆| 施甸县| 横山县| 黑龙江省| 乃东县| 阜宁县| 武夷山市| 柳江县| 勐海县| 大方县| 桑植县| 兴安县| 嫩江县| 沁水县| 玉树县| 兴宁市| 三明市| 阿克苏市| 耿马| 咸宁市| 木兰县|