基本概念
閉包類似于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ù)")
}