closure
2020-06-30 本文已影响0人
VervertomJC
閉包語法表達:
//閉包表達式
{ (parameters) -> return type in
statements
}
從上下文推斷
當將閉包作為內聯閉包表達式傳遞給函數或方法時,總是可以推斷出參數類型和返回類型。因此,當閉包用作函數或方法參數時,無需編寫其完整的形式
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2 } )
- 作為參數時,省略 閉包參數括號
()
、箭頭->
和返回值return type
reversedNames = names.sorted(by:{s1, s2 in return s1 > s2} )
- 單個表達式 閉包 隱式返回 (隱藏
return
)
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
- 速記參數名稱
swift 自動為內聯閉包提供速記名稱,在閉包表達式中使用名稱$0, $1參數名稱,可以省略in
reversedNames = names.sorted(by: { $0 > $1 } )
- 運算符方法
reversedNames = names.sorted(by: > )
- 尾隨閉包
func someFunctionThatTakesAClosure(closure: ( ) -> Void) {
}
尾隨閉包 寫在括號之外
reversedNames = names.sorted( ) { $0 > $1 }
省略()
reversedNames = names.ssorted { $0 > $1 }
一般形式
//一般形式
//有参有反
let testOne: (String, String) -> String = {(str1, str2) in return str1 + str2}
print(testOne("one", "two"))
//无参有反 可以直接省略 "in"
let testTwo: () -> String = {return "test闭包"}
//无参无反
let testThree: () -> Void = {print("test闭包")}
別名
//可以用"typealias"先声明一个闭包类型
typealias testBlock = (String) -> Void
let aaa: testBlock = {str in
print(str)
}
closure中避免循環引用
方法一:
weak var weakSelf = self
loadata {
print("callback")
weakSelf!.view.backgroundColor = UIColor.brown
}
}
方法二:
loadata { [weak self] () -> () in
print("callback")
// 在swift開發中,能不寫self就不寫self,但是在閉包中必須寫上self
self!.view.backgroundColor = UIColor.brown
}
}
方法三:
- 使用關鍵字
unowned
- 從行為上
unowned
更像OC中的unsafe_unretained
-
unowned
表示:即使他原來引用的對象被釋放了,仍會保持對被已經釋放了的對象的一個 "無效的" 引用,牠不能是Optional
值,也不會被指向nil
loadata { [unowned self] () -> () in
print("callback")
self.view.backgroundColor = UIColor.brown
}
}
Reference: