關(guān)于閉包的概念,相信有過其他語言開發(fā)經(jīng)驗的朋友都不會陌生了。簡單來說閉包的語言特性,大大增加了我們的開發(fā)效率。而 Swift 更是將閉包運用的游刃有余,仿佛為它而生。下面咱們進入正題。
Swift 中閉包的概念就像是 Objective-C 中的 block。 閉包可以嵌套和作為參數(shù)傳遞。 在 Swift 中,函數(shù)也只不過是一種特殊的閉包。
定義函數(shù)
Swift 中 可以使用 func 關(guān)鍵字來定義函數(shù)。函數(shù)可以接收并返回一個或者多個參數(shù)和元組。 返回值跟隨在 -> 符號后。
func sayHello(firstName: String, lastName: String) -> String {
return "Hello \\(lastName) \\(firstName)"
}
調(diào)用函數(shù)
prinln(sayHello("John", "Smith")) //"Hello Smith John"
函數(shù)的類型
每個函數(shù)都有它自己的函數(shù)類型,通過它的參數(shù)和返回值來確定。比如這個函數(shù):
func add(left: Int, right:Int) -> Int { return left + right }
它的函數(shù)類型為:
(Int, Int) -> (Int)
我們剛剛了解了函數(shù)類型的概念,它可以用來作為參數(shù)和返回值的類型來使用。
將函數(shù)作為參數(shù)和返回值傳遞
下面這個函數(shù)的返回值仍然是一個函數(shù),并且作為返回值的這個函數(shù)可以賦值給一個變量并調(diào)用:
func buildSayHello() -> (String,String) -> String {
func hello(firstName:String, lastName:String) -> String {
return "Hello \\(lastName) \\(firstName)"
}
return hello
}
let hello = buildSayHello()
hello("John","Smith")
是不是有點奇妙的感覺了? 對,函數(shù)本身也是一個對象實例。
帶有可變參數(shù)的函數(shù)
函數(shù)還可以接收任意數(shù)量的參數(shù),通過 ... 來表示,然后我們就可以在函數(shù)體中用數(shù)組的形式訪問這個函數(shù)了:
func todo (tasks:String...) -> () {
for task in tasks {
println("* \\(task)")
}
}
todo("exercise","study","sleep")
定義閉包
我們剛說過,函數(shù)也是一種特殊的閉包,那么我們再來看下定義閉包的語法:
{() -> () in}
閉包的定義包含在一對大括號中,其中 () ->() 定義了函數(shù)的參數(shù)類型和返回值, -> 的左邊括號中是參數(shù)列表,右邊是返回值。然后用 in 關(guān)鍵字將閉包的頭部和主體分隔開來。對閉包定義的一個描述:
{(param) -> returnType in
statements
}
比如我們 Array 的 sort 方法接收的就是一個閉包參數(shù):
var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort { (lhs, rhs) -> Bool in
return lhs < rhs
}
閉包的便捷操作
閉包還可以用參數(shù)的位置的形式來應(yīng)用參數(shù) ($0,$1,$2),比如還是上面那個數(shù)組例子:
var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort({ return $0 < $1 })
再有,如果閉包作為參數(shù)列表中的最后一個參數(shù),你可以直接忽略它外面的括號,就像這樣:
numbers.sort { return $0 < $1 }
更多精彩內(nèi)容可關(guān)注微信公眾號:
swift-cafe