Swift閉包(closures)有很多優(yōu)化的地方
- 根據(jù)上下文推斷參數(shù)和返回值類型
- 從單行表達(dá)式閉包中隱式返回(也就是閉包體只有一行代碼,可以省略return)
- 可以使用簡(jiǎn)化參數(shù)名,如
1(從0開始,表示第i個(gè)參數(shù)...)
- 提供了尾隨閉包語法(Trailing closure syntax)
閉包完全體語法
{(s1: T, s2: T) -> Type in
///代碼實(shí)現(xiàn)
...
return type
}
- 代碼簡(jiǎn)寫
///自動(dòng)閉包
let student1 = {
print("省略參數(shù)和 in")
}
- 參數(shù)名稱縮寫
let sortBlock = { (s1: String, s2: String) -> Bool in
///完全體
return s1 > s2
}
///$0、$1 表示第一個(gè) 第二個(gè)參數(shù) 縮寫1
let sortBlock1 = { return $0 > $1 }
- 尾隨閉包,閉包作為最后一個(gè)參數(shù)的時(shí)候,可以省略掉參數(shù)名
func lastColosure(colosure: ()->()){
colosure()
}
調(diào)用1
lastColosure(colosure: {
})
簡(jiǎn)寫
lastColosure() {
}
當(dāng)只有閉包一個(gè)參數(shù)的時(shí)候,括號(hào)也可以省略
lastColosure {
}
Swift 中 閉包作為參數(shù)和返回值
閉包作為參數(shù)的時(shí)候,是在函數(shù)實(shí)現(xiàn)內(nèi)部調(diào)用這個(gè)閉包;閉包作為返回值,是在函數(shù)實(shí)現(xiàn)部分實(shí)現(xiàn)閉包。
作為參數(shù)
func getData(url: String, complete:(Data)->()){
let data = NSData(contentsOfFile: url) as Data?
/// 在此處調(diào)用 閉包
complete(data)
}
/// 函數(shù)調(diào)用
getData(url: "") { data in
/// 閉包實(shí)現(xiàn)
print(data)
}
作為返回值
方式一:內(nèi)部函數(shù)作為返回值,因?yàn)楹瘮?shù)的類型是 `(String) -> Int` 類型
func students(names: [String]) -> ((String) -> Int){
func nameFunc(str: String) -> Int{
return str.count
}
return nameFunc(str:)
}
方式二:
func students(names: [String]) -> ((String) -> Int){
return { $0.count }
}
調(diào)用
let name = students(names: ["myk"])
let a = name("123")
`name` 是 `(String) -> Int`類型
`a` 是 `Int`類型
在學(xué)習(xí)RxSwift的時(shí)候,他的bind函數(shù)讓我困惑好久
bind函數(shù),有兩個(gè)參數(shù) A 和 B,參數(shù)A又是一個(gè)函數(shù)
參數(shù)A :參數(shù):信號(hào) 返回值:閉包
參數(shù)B:一個(gè)類型
func bind<R1, R2>(to binder: (Observable<[Self]>) -> (R1) -> R2, curriedArgument: R1) -> R2
Rx給出的一個(gè)例子中
Observable.just([1,2,3])
.bind(to: picker1.rx.itemTitles, curriedArgument: { name, item in
return "\(item)"
})
.disposed(by: dispose)
picker1.rx.itemTitles中itemTitles是一個(gè)函數(shù)類型
func itemTitles(_ source: Source) -> (@escaping (Int, Sequence.Element) -> String?) -> Disposable
它的類型是
(_ source: Source) -> (@escaping (Int, Sequence.Element) -> String?) -> Disposable
和 bind 函數(shù)的參數(shù)A (Observable<[Int]>) -> (R1) -> R2 類型是一樣的。
類比一下(@escaping (Int, Sequence.Element) -> String?) == R1,Disposable == R2。
bind函數(shù)的第二個(gè)參數(shù)curriedArgument也就是參數(shù)B, 傳的是一個(gè)R1類型的數(shù)據(jù),也就是 (@escaping (Int, Sequence.Element) -> String?)類型,因此參數(shù)B是一個(gè)閉包<也可以傳一個(gè)函數(shù)>。