Swift 中的利刃,函數和閉包

Swift 中的利刃,函數和閉包

關於閉包的概念,相信有過其餘語言開發經驗的朋友都不會陌生了。簡單來講閉包的語言特性,大大增長了咱們的開發效率。而 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 }
相關文章
相關標籤/搜索