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"

函數的類型

每個函數都有它自己的函數類型,通過它的參數和返回值來確定。比如這個函數:

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
}

比如我們 Arraysort 方法接收的就是一個閉包參數:

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
更多好文,掃碼關注微信公眾號:

更多文章請訪問: www.theswiftworld.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM