Swift 中的利刃,函數(shù)和閉包

關(guān)于閉包的概念,相信有過其他語言開發(fā)經(jīng)驗的朋友都不會陌生了。簡單來說閉包的語言特性,大大增加了我們的開發(fā)效率。而 Swift 更是將閉包運用的游刃有余,仿佛為它而生。下面咱們進入正題。

Swift 中閉包的概念就像是 Objective-C 中的 block。 閉包可以嵌套和作為參數(shù)傳遞。 在 Swift 中,函數(shù)也只不過是一種特殊的閉包。

定義函數(shù)

Swift 中 可以使用 func 關(guān)鍵字來定義函數(shù)。函數(shù)可以接收并返回一個或者多個參數(shù)和元組。 返回值跟隨在 -> 符號后。

func sayHello(firstName: String, lastName: String) -> String {
    return "Hello \\(lastName) \\(firstName)"
}

調(diào)用函數(shù)

prinln(sayHello("John", "Smith"))       //"Hello Smith John"

函數(shù)的類型

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

func add(left: Int, right:Int) -> Int { return left + right }

它的函數(shù)類型為:

(Int, Int) -> (Int)

我們剛剛了解了函數(shù)類型的概念,它可以用來作為參數(shù)和返回值的類型來使用。

將函數(shù)作為參數(shù)和返回值傳遞

下面這個函數(shù)的返回值仍然是一個函數(shù),并且作為返回值的這個函數(shù)可以賦值給一個變量并調(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")

是不是有點奇妙的感覺了? 對,函數(shù)本身也是一個對象實例。

帶有可變參數(shù)的函數(shù)

函數(shù)還可以接收任意數(shù)量的參數(shù),通過 ... 來表示,然后我們就可以在函數(shù)體中用數(shù)組的形式訪問這個函數(shù)了:

func todo (tasks:String...) -> () {
    
    for task in tasks {

        println("* \\(task)")
        
    }
    
}
todo("exercise","study","sleep")

定義閉包

我們剛說過,函數(shù)也是一種特殊的閉包,那么我們再來看下定義閉包的語法:

{() -> () in}

閉包的定義包含在一對大括號中,其中 () ->() 定義了函數(shù)的參數(shù)類型和返回值, -> 的左邊括號中是參數(shù)列表,右邊是返回值。然后用 in 關(guān)鍵字將閉包的頭部和主體分隔開來。對閉包定義的一個描述:

{(param) -> returnType in
    statements
}

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

var numbers:Array<Int> = [3,5,4,2,1,8]

numbers.sort { (lhs, rhs) -> Bool in
    return lhs < rhs
}

閉包的便捷操作

閉包還可以用參數(shù)的位置的形式來應(yīng)用參數(shù) ($0,$1,$2),比如還是上面那個數(shù)組例子:

var numbers:Array<Int> = [3,5,4,2,1,8]
numbers.sort({ return $0 < $1 })

再有,如果閉包作為參數(shù)列表中的最后一個參數(shù),你可以直接忽略它外面的括號,就像這樣:

numbers.sort { return $0 < $1 }

更多精彩內(nèi)容可關(guān)注微信公眾號:
swift-cafe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容