關(guān)于閉包的概念著觉,相信有過(guò)其他語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn)的朋友都不會(huì)陌生了村生。簡(jiǎn)單來(lái)說(shuō)閉包的語(yǔ)言特性,大大增加了我們的開(kāi)發(fā)效率饼丘。而 Swift 更是將閉包運(yùn)用的游刃有余趁桃,仿佛為它而生。下面咱們進(jìn)入正題。
Swift
中閉包的概念就像是 Objective-C
中的 block
卫病。 閉包可以嵌套和作為參數(shù)傳遞油啤。 在 Swift 中,函數(shù)也只不過(guò)是一種特殊的閉包蟀苛。
定義函數(shù)
Swift
中 可以使用 func
關(guān)鍵字來(lái)定義函數(shù)益咬。函數(shù)可以接收并返回一個(gè)或者多個(gè)參數(shù)和元組。 返回值跟隨在 ->
符號(hào)后屹逛。
func sayHello(firstName: String, lastName: String) -> String {
return "Hello \\(lastName) \\(firstName)"
}
調(diào)用函數(shù)
prinln(sayHello("John", "Smith")) //"Hello Smith John"
函數(shù)的類(lèi)型
每個(gè)函數(shù)都有它自己的函數(shù)類(lèi)型,通過(guò)它的參數(shù)和返回值來(lái)確定。比如這個(gè)函數(shù):
func add(left: Int, right:Int) -> Int { return left + right }
它的函數(shù)類(lèi)型為:
(Int, Int) -> (Int)
我們剛剛了解了函數(shù)類(lèi)型的概念汛骂,它可以用來(lái)作為參數(shù)和返回值的類(lèi)型來(lái)使用罕模。
將函數(shù)作為參數(shù)和返回值傳遞
下面這個(gè)函數(shù)的返回值仍然是一個(gè)函數(shù),并且作為返回值的這個(gè)函數(shù)可以賦值給一個(gè)變量并調(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")
是不是有點(diǎn)奇妙的感覺(jué)了帘瞭? 對(duì)淑掌,函數(shù)本身也是一個(gè)對(duì)象實(shí)例。
帶有可變參數(shù)的函數(shù)
函數(shù)還可以接收任意數(shù)量的參數(shù)蝶念,通過(guò) ...
來(lái)表示抛腕,然后我們就可以在函數(shù)體中用數(shù)組的形式訪(fǎng)問(wèn)這個(gè)函數(shù)了:
func todo (tasks:String...) -> () {
for task in tasks {
println("* \\(task)")
}
}
todo("exercise","study","sleep")
定義閉包
我們剛說(shuō)過(guò),函數(shù)也是一種特殊的閉包媒殉,那么我們?cè)賮?lái)看下定義閉包的語(yǔ)法:
{() -> () in}
閉包的定義包含在一對(duì)大括號(hào)中担敌,其中 () ->()
定義了函數(shù)的參數(shù)類(lèi)型和返回值, ->
的左邊括號(hào)中是參數(shù)列表廷蓉,右邊是返回值全封。然后用 in
關(guān)鍵字將閉包的頭部和主體分隔開(kāi)來(lái)。對(duì)閉包定義的一個(gè)描述:
{(param) -> returnType in
statements
}
比如我們 Array
的 sort
方法接收的就是一個(gè)閉包參數(shù):
var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort { (lhs, rhs) -> Bool in
return lhs < rhs
}
閉包的便捷操作
閉包還可以用參數(shù)的位置的形式來(lái)應(yīng)用參數(shù) ($0,$1,$2)桃犬,比如還是上面那個(gè)數(shù)組例子:
var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort({ return $0 < $1 })
再有刹悴,如果閉包作為參數(shù)列表中的最后一個(gè)參數(shù),你可以直接忽略它外面的括號(hào)攒暇,就像這樣:
numbers.sort { return $0 < $1 }
更多精彩內(nèi)容可關(guān)注微信公眾號(hào):
swift-cafe