Objective-C中的block與Swift中的尾隨閉包使用教程
前言
在項(xiàng)目開發(fā)中經(jīng)常會(huì)去查iOS閉包怎么寫,因?yàn)樗恼Z法太古怪,兩種語言寫法不一,經(jīng)常搞混,干脆記錄下常用的寫法算了
閉包定義
閉包是指可以包含自由(未綁定到特定對(duì)象)變量的代碼塊;這些變量不是在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量)?!伴]包” 一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對(duì)象沒有被釋放)和為自由變量提供綁定的計(jì)算環(huán)境(作用域)。
OC中的block與Swift中的尾隨閉包都起到了將參數(shù)作為返回值的作用,也就是常說的回調(diào)。
1. block的使用
在OC中block主要分為三種,分別是
(1)_NSConcreteGlobalBlock 全局靜態(tài),
(2)_NSConcreteStackBlock 保存在棧中,出函數(shù)作用域就銷毀,
(3)_NSConcreteMallocBlock 保存在堆中,retainCount == 0銷毀。
而我們?cè)谑褂胋lock時(shí)大致分為以下幾步:
//1.使用typedef定義一個(gè)block typedef void(^CallBack1)(); //不帶參數(shù) typedef void(^CallBack2)(NSString *test); //帶參數(shù) //2.通過屬性聲明 @property (nonatomic, copy) CallBack callBack; //3.通過函數(shù)方法聲明 - (void)functionCallBack:(CallBack)callBack;
其實(shí)呢,如果寫的比較熟練了,也可以連著一起定義:
@property (nonatomic, strong) void(^ completed1)();//不帶參數(shù) @property (nonatomic, strong) void(^ completed2)(NSString *test);//帶參數(shù) - (void) functionCallBack:(void(^)())completed1;//不帶參數(shù) - (void) functionCallBack:(void(^)(NSString *test))completed2;//帶參數(shù)
2. 尾隨閉包的使用
在Swift中,閉包是一段自包含的函數(shù)代碼塊,可以在代碼中使用和傳遞,相當(dāng)于一個(gè)匿名函數(shù)。
那么尾隨閉包就是這個(gè)函數(shù)的最后一個(gè)參數(shù)是一個(gè)閉包,所以規(guī)定這個(gè)閉包既可以寫在函數(shù)的參數(shù)括號(hào)里面,也可以直接放在最后面來使用,就像重新給這個(gè)函數(shù)定義了一次一樣。
并且,它的寫法和block很相似:
//1.使用typealias定義 typealias functionBlock1 = () -> ()//不帶參數(shù) typealias functionBlock2 = (String) -> ()//帶參數(shù) //2.聲明函數(shù)體 func blockTest1(complete: (functionBlock1)) -> () { complete() } func blockTest2(complete: (functionBlock2)) -> () { let re: String = "Cookie" complete(re) } //3.使用函數(shù) blockTest1 {} blockTest2{ (result) in print(result) }
同樣的,如果寫的比較熟練了,也可以連著一起定義:
//1.聲明函數(shù)體 func blockTest(complete: (_ result: String)->()) -> () { let re: String = "Cookie" complete(re) } //2.使用函數(shù) blockTest { (result) in print(result) }
除此之外,swift中的閉包還包括逃逸閉包,這個(gè)閉包在函數(shù)返回之后才被執(zhí)行,我們稱該閉包從函數(shù)中逃逸,多用來做函數(shù)回調(diào),與Objective-C里的Block有異曲同工之妙。自動(dòng)閉包,作為參數(shù)傳遞給函數(shù)時(shí),可以將閉包定義為自動(dòng)閉包(使用關(guān)鍵字@autoclosure),這樣傳遞參數(shù)時(shí),可以直接傳遞一段代碼(或者一個(gè)變量、表達(dá)式),系統(tǒng)會(huì)自動(dòng)將這段代碼轉(zhuǎn)化成閉包。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Swift類型創(chuàng)建之自定義一個(gè)類型詳解
這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個(gè)類型詳解,本文講解了自定義原型、實(shí)現(xiàn)默認(rèn)值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內(nèi)容,需要的朋友可以參考下2015-05-05swift版webview加載網(wǎng)頁進(jìn)度條效果
這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)webview加載網(wǎng)頁進(jìn)度條效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Swift 4中一些實(shí)用的數(shù)組技巧小結(jié)
這篇文章主要給大家分享了關(guān)于Swift 4中一些實(shí)用的數(shù)組技巧,文中通過示例代碼介紹的介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03