swift學(xué)習(xí)之閉包

基本概念

閉包類似于oc中的block,用于保存一段代碼,在需要的時(shí)候執(zhí)行
閉包是引用類型

尾隨閉包

閉包作為函數(shù)的最后一個(gè)參數(shù)出現(xiàn)時(shí),這個(gè)閉包被稱為尾隨閉包

閉包的基本格式

{
 (參數(shù)列表) -> 返回值類型 in
//需要執(zhí)行的代碼
}

//閉包當(dāng)作一個(gè)變量
let closure = {(a:String,b:String) -> String in
      return a + b
}
//閉包當(dāng)作一個(gè)函數(shù)參數(shù)
func loadData(finished:() -> ())
{
     finished()
}
//閉包沒(méi)有參數(shù)有返回值
func refreshMore(finished:() -> String)
{
    print(finished())
}
//快遞員app登錄網(wǎng)絡(luò)請(qǐng)求
class func POST(url url:String,
                var params:[String:AnyObject]?,
                success:((responseObj:JSON)-> Void)?,
                failure:((error:NSError)-> Void)?)
{

}

閉包的執(zhí)行

(尾隨閉包)閉包在不影響語(yǔ)義的情況下,可以任意簡(jiǎn)寫(xiě)
Xcode會(huì)在我們編寫(xiě)代碼的時(shí)候適當(dāng)?shù)慕o閉包格式做出簡(jiǎn)寫(xiě)
閉包中如果只有參數(shù)沒(méi)有返回值,可以將參數(shù)列表的小括號(hào)省略,用in分割參數(shù)列表與閉包體實(shí)現(xiàn)部分
尾隨閉包的閉包體可以放在函數(shù)的其他參數(shù)列表()后面
如果閉包既沒(méi)有參數(shù)又沒(méi)有返回值那么in之前到左邊大括號(hào)之間的東西都可以省略
如果閉包包體只有一句話,那么可以省略返回值類型和函數(shù)題的return語(yǔ)句

閉包當(dāng)作一個(gè)變量

let eClosure = closure("Hello","World")
print(eClosure);

閉包作為函數(shù)參數(shù)

//最原始的形態(tài)
loadloadData({() -> () in 
    print("加載數(shù)據(jù)")
})
//簡(jiǎn)寫(xiě)個(gè)方式1,尾隨閉包的閉包體移動(dòng)到其他參數(shù)列表的()后面
loadData() { () -> () in
     print("加載數(shù)據(jù)")  
}

//簡(jiǎn)寫(xiě)個(gè)方式2,函數(shù)有且只有一個(gè)參數(shù)就是閉包,其他參數(shù)列表的()是沒(méi)有意義的可以直接省略,這是系統(tǒng)默認(rèn)的簡(jiǎn)寫(xiě)格式
loadData { () -> () in
     print("加載數(shù)據(jù)")  
}

//簡(jiǎn)寫(xiě)個(gè)方式3,閉包即沒(méi)有參數(shù)也沒(méi)有返回值,那么() -> ()參數(shù)值列表和返回值類型都是沒(méi)有意義的可以省略,而in用于間隔參數(shù)列表和返回值類型,() -> ()都省略了,in就沒(méi)有存在的意義了,省略
loadData 
{
     print("加載數(shù)據(jù)")  
}

//這里閉包雖然沒(méi)有參數(shù),但是如果將()省略,那么就沒(méi)有辦法區(qū)分
//String到底是返回值類型還是參數(shù)列表
refreshMore { () -> String in
    return "下拉加載更多"
}

JLBHttpTool.POST(url: LOGIN, 
                     params: param, 
                    success: { (responseObj) -> Void in
                                    //請(qǐng)求成功處理
                             })
                             { (error) -> Void in
                                     //請(qǐng)求失敗處理
}

循環(huán)引用

與OC中的block相似的,閉包同樣存在循環(huán)引用,處理辦法如下
weak var weakSelf = self
[weak self]//推薦使用

loadData { [weak self]  in
     print("加載數(shù)據(jù)")  
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 閉包的介紹 閉包和OC中的block非常相似 OC中的block是匿名的函數(shù) Swift中的閉包是一個(gè)特殊的函數(shù) ...
    CoderLWG閱讀 276評(píng)論 0 0
  • 閉包和oc中的block非常相似,OC中的block非常像匿名的函數(shù),閉包是用來(lái)定義函數(shù)(方法的)。作用: blo...
    WMSmile閱讀 226評(píng)論 0 0
  • 在上一篇文章Swift中的變量和常量中我總結(jié)了一些自己對(duì)于變量和常量的認(rèn)識(shí),最近學(xué)習(xí)了閉包,順便給大家分享一下關(guān)于...
    老板娘來(lái)盤(pán)一血閱讀 18,893評(píng)論 16 87
  • 閉包是自包含的函數(shù)代碼塊,可以在代碼中被傳遞和使用。Swift 中的閉包與 C 和 Objective-C 中的代...
    雨影閱讀 785評(píng)論 0 2
  • swift中閉包類似于oc中的Block語(yǔ)句塊 一、一個(gè)最簡(jiǎn)單的閉包實(shí)現(xiàn) ??1 閉包就是寫(xiě)好的一段代碼,然后在某一...
    星橋似海閱讀 340評(píng)論 0 2

友情鏈接更多精彩內(nèi)容