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