關於閉包的概念,相信有過其餘語言開發經驗的朋友都不會陌生了。簡單來講閉包的語言特性,大大增長了咱們的開發效率。而 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"
每一個函數都有它本身的函數類型,經過它的參數和返回值來肯定。好比這個函數:ui
func add(left: Int, right:Int) -> Int { return left + right }
它的函數類型爲:spa
(Int, Int) -> (Int)
咱們剛剛瞭解了函數類型的概念,它能夠用來做爲參數和返回值的類型來使用。code
下面這個函數的返回值仍然是一個函數,而且做爲返回值的這個函數能夠賦值給一個變量並調用:對象
func buildSayHello() -> (String,String) -> String { func hello(firstName:String, lastName:String) -> String { return "Hello \\(lastName) \\(firstName)" } return hello } let hello = buildSayHello() hello("John","Smith")
是否是有點奇妙的感受了? 對,函數自己也是一個對象實例。ci
函數還能夠接收任意數量的參數,經過 ...
來表示,而後咱們就能夠在函數體中用數組的形式訪問這個函數了:開發
func todo (tasks:String...) -> () { for task in tasks { println("* \\(task)") } } todo("exercise","study","sleep")
咱們剛說過,函數也是一種特殊的閉包,那麼咱們再來看下定義閉包的語法:it
{() -> () 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 }