用最少的篇幅記錄經(jīng)典概念
1.閉包表達式語法
{
(參數(shù)表) -> 返回值類型 in
...
}
2.簡化
let names = ["Chris","Alex","Ewa"]
基本寫法
var result = names.sorted(by: {s1:String,s2:String) -> Bool in
return s1 > s2
})
省去參數(shù)和返回值聲明
var result = names.sorted(by: {s1,s2 in return s1 > s2 })
再省去return
var result = names.sorted(by: {s1,s2 in s1 > s2 })
再將參數(shù)名縮寫并省去
var result = names.sorted(by: {$0 > $1 })
運算符方法>正好滿足sorted的函數(shù)參數(shù)類型,嚴格說這不算省略演顾,>本身就是一個函數(shù)名蒸苇。看起來簡潔而已
var result = names.sorted(by: > )
尾隨閉包
閉包表達式做最后一個參數(shù)時椭豫,可以把閉包放在函數(shù)參數(shù)括號之后捌朴。也不用寫參數(shù)標簽津函。
var result = names.sorted() {$0 > $1 } //去掉了 by:
如果是唯一參數(shù),還可以省掉()
var result = names.sorted {$0 > $1 }
3.值捕獲
這個在其他語言里不是什么新鮮事:
閉包里可以訪問和修改上下文(閉包之外定義)的變量破讨、常量丛晦,哪怕他們的作用域已經(jīng)不存在了。
但是提陶,一旦要解決閉包引起的循環(huán)強引用時烫沙,就要再次提到值捕獲。比如閉包非常典型的會和self實例產(chǎn)生相互引用導致無法自動銷毀隙笆⌒啃睿可以把這些引用放到'捕獲列表'中升筏,聲明為非強引用(是弱的或者無主的)
//代碼片段
class X {
var asHTML : Void -> String = {
[unowned self , weak otherProp = self.otherProp ] in //捕獲列表降低強引用
if let text = self.text {
return ... //偽代碼
} else ... //偽代碼
}
}
4.逃逸閉包
閉包作為參數(shù)傳入函數(shù)但是在函數(shù)返回之后才執(zhí)行就是逃逸閉包。函數(shù)的參數(shù)要加@escaping. 逃逸閉包中要顯式引用self.
帶?的不能加@escaping
class Student{
private var doWork:(()->())?
//init(delegate: (()->())?){
init(delegate: @escaping ()->()){
self.doWork = delegate
}
deinit {
print("deinit student")
}
}