跟Block
很像,表示代碼的集合指黎,簡稱代碼塊朋凉。
可以被傳遞,不會(huì)馬上被執(zhí)行醋安,當(dāng)然后期可以被執(zhí)行多次杂彭。
NSURLSession
的completionHandler
就是一個(gè)closure
對象,這個(gè)對象會(huì)在NSURLSession
收到了服務(wù)器的返回?cái)?shù)據(jù)或者錯(cuò)誤信息之后被執(zhí)行吓揪。
一般closure
有下面兩種:
{ parameters in
//Code
}
或者沒有參數(shù)的版本:
{
//Code
}
第一種中亲怠,in
關(guān)鍵字分割了參數(shù),就像函數(shù)和方法那樣柠辞,closure
可以接收參數(shù)团秽,在in
關(guān)鍵字之前,而且不需要指明參數(shù)類型叭首,如果想要指明參數(shù)類型也可以:
下面是指明了closure
的參數(shù)類型的聲明方法:
let dataTask = session.dataTaskWithURL(url, completionHandler: {
(data: NSData?, response: NSURLResponse?, error: NSError?) in
...
})
在closure
代碼中习勤,可以使用 $0 $1 $2 來代替參數(shù)。
如果調(diào)用的方法的最后一個(gè)參數(shù)是一個(gè)closure
焙格,那么可以對掉用進(jìn)行簡寫:
let dataTask = session.dataTaskWithURL(url) {
data, response, error in
...
}
不簡寫的版本是:
let dataTask = session.dataTaskWithURL(url, completionHandler:{
data, response, error in
...
})
簡寫的版本更加易讀姻报。
closure
也可以用作 初始化對象 和lazy loading
lazy var dateFormatter: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateStyle = .MediumStyle
formatter.timeStyle = .ShortStyle
return formatter
}()
在Swift
中所有的 方法 都是closure
,可以直接將一個(gè)已有的方法當(dāng)做closure
在參數(shù)中進(jìn)行傳遞间螟,只要 參數(shù)列表是匹配的。
let dataTask = session.dataTaskWithURL(url,
completionHandler: myCompletionHandlerMethod)
func myCompletionHandlerMethod(data: NSData?,
response: NSURLResponse?, error: NSError?) {
...
}
closure
會(huì)捕獲所有在內(nèi)部使用的變量损肛,包括self
厢破,會(huì)有幾率造成引用循環(huán)和內(nèi)存泄露,解決方法:
let dataTask = session.dataTaskWithURL(url) {
[weak self] data, response, error in
...
}
最后:Swift
支持一種no escape
的closure
治拿,后續(xù)再補(bǔ)充: