日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS开发基础之OC的Block入门_Day09-Block

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS开发基础之OC的Block入门_Day09-Block 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IOS開發基礎之OC的Block入門_Day09-Block

block是oc的重要的基礎知識,重點之重。跟協議一樣重要,是進行函數回調重要手段。在后續的UI學習具有舉足輕重的地位。學會基礎的block,夯實基礎,有的放矢。
第一天

// // main.m // Day09-Block // // Created by 魯軍 on 2021/4/23. // /**BOOLBooleanclassnilSELidblockblock 是一個數據類型int double float char .....既然是1個數據類型。那么就可以聲明這個數據類型的變量,所以我們完全可以 聲明1個 block 類型的變量不同類型的變量中可以存儲不同類型的數據那么block 類型的變量中可以存儲什么樣的數據呢?1) block 是1個數據類型,所以我們聲明1個block 類型的變量2) block類型的變量中專門存儲1段代碼的,可以有參數,可以有返回值3. block的變量的聲明1) 雖然block 變量中是用來存儲1段代碼的,但是1個block 并不是 任意的一段代碼能存進去的,而是有限定的,也就是說,在聲明block變量的時候,必須 要指定 這個block變量的存儲的代碼段是否有參數,是否有返回值聲明可1個 block 返回值是void 參數是1個int類型的這個時候,這個block變量中就只能存儲無返回值的 并且 有1個int參數的代碼段2) 聲明block的語法格式返回值的類型 (^block變量的名稱) (參數列表)void(^myBlock1)(); 表示聲明1個block 類型的變量叫做myBlock1 這個變量變量中只能存儲沒有返回值的沒有參數的代碼段int(^myBlock2)();int(^myBlock3)(int num1,int num2);3) 聲明block的變量的時候, 要指定這個block的變量可以存儲的代碼段的返回值和參數描述一旦指定 這個block 只能存儲這樣的額代碼段了,其他格式的代碼段無法存儲4.初始化block變量1) 原理。寫1個符合。block符合要求的 代碼段。存儲到blick變量中就可以了2)代碼段的書寫格式^返回值類型(參數列表){代碼段;};3) 寫1個無參數。無返回值 的代碼段^void(){NSLog(@"大家好,我愛你");NSLog(@"大家好,我恨你");};當然也可以在聲明block變量的同時使用符合要求的block變量中void(^myBlock1)();myBlock1 = ^void(){NSLog(@"大家好,我愛你");NSLog(@"大家好,我恨你");};4)。 有返回值的代碼段^int( ){int num1 = 10 + 20;return num1;} ;我們就可以將這段代碼賦值給符合要求的block變量中int (^myBlock2)() = ^int () {int num1 = 10+20;return num1;};5) 既有參數 又有返回值的代碼段^int (int num1,int num2) {int num2 = num2+num1;return num3;}; 6 如何執行存儲在block的變量的代碼中myBlock1();所以我們可以將這個代碼段賦值給符合要求的block變量6) 注意: 賦值給block的必須賦值符合block變量的要求,否則就會報錯這個時候,我們就可以將這段代碼使用賦值符號 存儲到無返回值無參數的block當中去了。7 block的簡寫1) 如果我們寫的代碼段的沒有返回值,那么代碼段的void可以省略void(^myBlock1)() = ^(){NSLog(@"大家好,我愛你");NSLog(@"大家好,我恨你");};注意 我們說的是代碼段的 返回值如果是void 可以省略。 ,聲明block變量的返回值無論是什么都不可以省略的2)如果我們寫的代碼段沒有參數,那么代碼段的小括弧可以省略int(^myBlock2)() = ^int {int num1 = 10 + 20;return num1;};再次強調。我們說的是代碼段所以當1個代碼段即沒有參數也沒有返回值 的時候,只寫^void (^myBlock_1)()= ^{};3)聲明block變量的時候,如果有指定的參數,可以只寫參數的類型 而不寫 參數的名稱int (^myBlock4_1)(int,int) = ^(int num1,int num2){int num3 = num1 + num2;return num3;};注意:我們說的是聲明block變量的時候,再寫代碼段的時候,類型和名稱都要寫4) 無論代碼段是否有返回值,在寫代碼的時候,可以不寫返回值類型 省略如果在寫代碼的時候,省略了返回值。,這個時候系統會自動的確定返回值類型如果代碼段沒有任何數據,那么他會認為這個代碼段是沒有返回值的如果代碼中有返回數據,返回的數據是什么類型,他就會認為這個代碼段是什么類型的建議: 不要簡寫,int(^myBlock3_3)(int,int)=^(int num1,int num2){int num3 = num1 + num2;return num3;};7. 簡化block變量的復雜定義typedef 的使用場景。將1個長類型定義為1個短類型3) 我們也可以使用typedef 將長的block類型定義1個短類型typedef 返回值類型 (^新類型)(參數列表);typedef void (^NewType)(); 代表重新定義了1個類型叫做NewType聲明1個無參數無返回的block8. 關于block 塊訪問的外部變量的問題1) 在block代碼塊的內部可以取定義在外部的變量的值,定義在外部的局部變量和全局變量2)在block代碼塊的內部可以修改全局變量的值,不能修改定義在外部的局部變量的值3)如果你希望我們定義的局部變量可以允許在block代碼的內部去修改,那么就為這個局部變量加1個__block的修飾符 */ #import <Foundation/Foundation.h> typedef void (^NewType)(); int num1 = 100; int main(int argc, const char * argv[]) {__block int num2 = 200;NewType block1 = ^(void){int num3 = 300;num2++;NSLog(@"我是哈哈");NSLog(@"%d",num2);};block1();/*//聲明1個無參數無返回的blocktypedef void (^NewType)(); //代表重新定義了1個類型叫做NewTypeNewType block1 = ^{NSLog(@"haha");};NewType block2;typedef int (^NewType2)(int num1,int num2);NewType2 t1 = ^int (int num1,int num2){return num1 + num2;};typedef unsigned long long int itcast;typedef int ChinaILove;itcast num1 = 10;ChinaILove num2= 20;NSUInteger i = 10;unsigned long i1 = 20;*//* void(^myBlock1)();int(^myBlock2)();int(^myBlock3)(int num1,int num2);myBlock1 = ^void(){NSLog(@"大家好,我愛你");NSLog(@"大家好,我恨你");};myBlock1();int (^myBlock2_1)() = ^int(){int num3 = 10 + 56;return num3;};NSLog(@"%d",myBlock2_1());int(^myBlock4)(int num1,int num2) = ^int(int num1,int num2) {int num3 = num2+num1;return num3;};int res= myBlock4(10,11);NSLog(@"%d",res);*/return 0; }

第2個項目

// // main.m // block作為函數的參數 // // Created by 魯軍 on 2021/4/24. // /**block 是1個數據類型,能不能作為參數呢,可以2 如何為函數定義block 類型的參數a. 就是在小括號中聲明1個指定格式的block變量就可以了b 可以使用typedef 簡化定義,這樣看起來就不會暈3 如果調用帶block的參數的函數呢a.如果要調用的函數的參數是block類型的,那么要求在調用的時候傳入1個和形參block要求的代碼段;b .調用的時候,可以先將代碼段存儲到1個block變量中,然后再傳遞這個block變量,也可以直接將符合要求的代碼段寫在小括弧中c .小技巧,通過xcode t提示自動生成代碼段4 將block 作為函數的參數可以實現什么樣的效果 可以將調用者自己寫1段代碼 傳遞到 函數內部區去執行*/ #import <Foundation/Foundation.h> typedef void (^NewType)(); //為這個參數定義1個參數,定義1個block類型的參數 //無參數無返回值的block void test(NewType block1){NSLog(@"~~~~~~~~~~");block1();NSLog(@"~~~~~~~~~~"); } void test2(int (^paramsBlock)(int num1,int num2)){NSLog(@"~~~~~~~~~~");int sum = paramsBlock(10,20);NSLog(@"sum = %d",sum);NSLog(@"~~~~~~~~~~"); } int main(int argc, const char * argv[]) {NewType type1 = ^(void){NSLog(@"哈哈");NSLog(@"😄");NSLog(@"😁");};test(type1);test(^(void){NSLog(@"哈哈");NSLog(@"😄");NSLog(@"😁");});test(^{NSLog(@"哈哈");NSLog(@"😄");NSLog(@"😁");});test2(^int(int num1, int num2) {return num1 + num2;});test(^{NSLog(@"我愛廣州小蠻腰");NSLog(@"北京天安門不愛");});return 0; }

第3個項目

// // main.m // 05-練習 // // Created by 魯軍 on 2021/4/24. // /*當方法內部需要執行1個功能,但是這個功能不確定那么這個時候,就使用block讓調用者將這個功能的具體實現傳遞進來*/ #import <Foundation/Foundation.h> #import "CZArray.h" int main(int argc, const char * argv[]) {char* contries[] = {"China","Jpanese","Aisa","India","Laos","Turkey","Vietnam","Bdqweqrwfddsfsda"};CZArray *a =[CZArray new];[a sortWIthCountries:contries andLength:sizeof(contries) / 8];/**2021-04-24 15:23:04.091049+0800 05-練習[2650:65152] Aisa2021-04-24 15:23:04.091645+0800 05-練習[2650:65152] China2021-04-24 15:23:04.091882+0800 05-練習[2650:65152] India2021-04-24 15:23:04.091998+0800 05-練習[2650:65152] Jpanese2021-04-24 15:23:04.092098+0800 05-練習[2650:65152] Laos2021-04-24 15:23:04.092126+0800 05-練習[2650:65152] Turkey2021-04-24 15:23:04.092144+0800 05-練習[2650:65152] Vietnam*/[a sortWIthCountries:contries andLength:(sizeof(contries) / 8) andCompareBlock:^BOOL(char *country1, char *country2) {int res = (int)strlen(country1)-(int)strlen(country2);if(res>0){return YES;}return NO;}];for(int i=0;i<sizeof(contries)/8;i++){NSLog(@"%s",contries[i]);}NSLog(@"~~~~~~~~~~~~~~~~~~~");[a sortWIthCountries:contries andLength:(sizeof(contries) / 8) andCompareBlock:^BOOL(char *country1, char *country2) {int res = strcmp(country1, country2);return res > 0;}];for(int i=0;i<sizeof(contries)/8;i++){NSLog(@"%s",contries[i]);}return 0; } // // CZArray.h // 05-練習 // // Created by 魯軍 on 2021/4/24. //#import <Foundation/Foundation.h> typedef BOOL (^NewType)(char *country1,char *country2); NS_ASSUME_NONNULL_BEGIN @interface CZArray : NSObject -(void) sortWIthCountries:(char*[])countries andLength:(int)len; -(void) sortWIthCountries:(char*[])countries andLength:(int)len andCompareBlock:(NewType) compareBlock; @endNS_ASSUME_NONNULL_END // // CZArray.m // 05-練習 // // Created by 魯軍 on 2021/4/24. //#import "CZArray.h" #import <string.h> @implementation CZArray - (void)sortWIthCountries:(char * _Nonnull *)countries andLength:(int)len{for(int i = 0;i<len-1;i++){for(int j=0;j<len-1-i;j++){int res = strcmp(countries[j], countries[j+1]);if(res>0){char* temp = countries[j];countries[j] = countries[j+1];countries[j+1] = temp;}}} } - (void)sortWIthCountries:(char * _Nonnull *)countries andLength:(int)len andCompareBlock:(NewType)compareBlock{for(int i = 0;i<len-1;i++){for(int j=0;j<len-1-i;j++){ // int res = strcmp(countries[j], countries[j+1]);BOOL res = compareBlock(countries[j], countries[j+1]);if(res==YES){char* temp = countries[j];countries[j] = countries[j+1];countries[j+1] = temp;}}} } @end

第4個項目

// // main.m // 06-練習2 // // Created by 魯軍 on 2021/4/24. //#import <Foundation/Foundation.h> #import "CZArray.h" typedef void (^NewType)(); NewType ttt(){void (^block1)() = ^{NSLog(@"123dfsd");};return block1; }int main(int argc, const char * argv[]) {CZArray *a = [CZArray new];[a bianLiWithBlock:^(int val) {NSLog(@"%d",val + 1);}];NewType type = ttt();type();return 0; } // // CZArray.h // 06-練習2 // // Created by 魯軍 on 2021/4/24. //#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface CZArray : NSObject {int _arr[10]; } -(void)bianLiWithBlock:(void(^)(int val))processBlock; @endNS_ASSUME_NONNULL_END // // CZArray.m // 06-練習2 // // Created by 魯軍 on 2021/4/24. //#import "CZArray.h"@implementation CZArray - (instancetype)init {self = [super init];if (self) {for(int i=1;i<11;i++){_arr[i-1] = i *10;}}return self; } -(void)bianLiWithBlock:(void(^)(int val))processBlock{for(int i=0;i<10;i++){processBlock(_arr[i]);}} @end

總結

以上是生活随笔為你收集整理的IOS开发基础之OC的Block入门_Day09-Block的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。