基本概念
閉包類似于oc中的block,用于保存一段代碼昵慌,在需要的時候執(zhí)行
閉包是引用類型
尾隨閉包
閉包作為函數(shù)的最后一個參數(shù)出現(xiàn)時,這個閉包被稱為尾隨閉包
閉包的基本格式
{
(參數(shù)列表) -> 返回值類型 in
//需要執(zhí)行的代碼
}
//閉包當作一個變量
let closure = {(a:String,b:String) -> String in
return a + b
}
//閉包當作一個函數(shù)參數(shù)
func loadData(finished:() -> ())
{
finished()
}
//閉包沒有參數(shù)有返回值
func refreshMore(finished:() -> String)
{
print(finished())
}
//快遞員app登錄網(wǎng)絡請求
class func POST(url url:String,
var params:[String:AnyObject]?,
success:((responseObj:JSON)-> Void)?,
failure:((error:NSError)-> Void)?)
{
}
閉包的執(zhí)行
(尾隨閉包)閉包在不影響語義的情況下,可以任意簡寫
Xcode會在我們編寫代碼的時候適當?shù)慕o閉包格式做出簡寫
閉包中如果只有參數(shù)沒有返回值吴菠,可以將參數(shù)列表的小括號省略橄教,用in分割參數(shù)列表與閉包體實現(xiàn)部分
尾隨閉包的閉包體可以放在函數(shù)的其他參數(shù)列表()
后面
如果閉包既沒有參數(shù)又沒有返回值那么in之前到左邊大括號之間的東西都可以省略
如果閉包包體只有一句話清寇,那么可以省略返回值類型和函數(shù)題的return語句
閉包當作一個變量
let eClosure = closure("Hello","World")
print(eClosure);
閉包作為函數(shù)參數(shù)
//最原始的形態(tài)
loadloadData({() -> () in
print("加載數(shù)據(jù)")
})
//簡寫個方式1,尾隨閉包的閉包體移動到其他參數(shù)列表的()后面
loadData() { () -> () in
print("加載數(shù)據(jù)")
}
//簡寫個方式2护蝶,函數(shù)有且只有一個參數(shù)就是閉包华烟,其他參數(shù)列表的()是沒有意義的可以直接省略,這是系統(tǒng)默認的簡寫格式
loadData { () -> () in
print("加載數(shù)據(jù)")
}
//簡寫個方式3持灰,閉包即沒有參數(shù)也沒有返回值盔夜,那么() -> ()參數(shù)值列表和返回值類型都是沒有意義的可以省略,而in用于間隔參數(shù)列表和返回值類型堤魁,() -> ()都省略了喂链,in就沒有存在的意義了,省略
loadData
{
print("加載數(shù)據(jù)")
}
//這里閉包雖然沒有參數(shù)妥泉,但是如果將()省略椭微,那么就沒有辦法區(qū)分
//String到底是返回值類型還是參數(shù)列表
refreshMore { () -> String in
return "下拉加載更多"
}
JLBHttpTool.POST(url: LOGIN,
params: param,
success: { (responseObj) -> Void in
//請求成功處理
})
{ (error) -> Void in
//請求失敗處理
}
循環(huán)引用
與OC中的block相似的,閉包同樣存在循環(huán)引用盲链,處理辦法如下
weak var weakSelf = self
[weak self]//推薦使用
loadData { [weak self] in
print("加載數(shù)據(jù)")
}