1. 程式人生 > >【swift-總結】閉包

【swift-總結】閉包

其實閉包就是函式
作為條件的函式

閉包表示式

首先宣告一個數組

var names = ["Charis", "Alex", "Ewa", "Barry", "Daniella"]

將這個陣列按照字母排序

宣告一個閉包函式

func backwards(s1: String, s2:String) -> Bool  {
    return s1 > s2
}

sorted()函式返回一個數組,sort()函式返回空,排序自身

///傳入閉包函式
names.sort(backwards)

使用閉包表示式

//閉包表示式就是一個函式在花括號裡面
names.
sort({(s1: String, s2: String) -> Bool in return s1 > s2})

又因為swift的值是可推斷型別

上面的又可以簡化

var reversed = names.sorted({s1, s2 in return s1 > s2})

單閉包隱式返回

//會隱式return
names.sorted({s1, s2 in s1 > s2})

名稱縮寫

names.sort({$0 > $1})

運算子函式

names.sort(>)

尾隨閉包

有時候閉包表示式太麻煩,可以把閉包寫在呼叫函式後面的花括號中

//呼叫sort函式,後面新增花括號,然後閉包表示式就寫在這裡
names.sort() {$0 > $1}

官方例子

//宣告一個字典
let digitNames = [0:"zero", 1:"one", 2:"two", 3:"three", 4:"four", 5:"five", 6:"six", 7:"seven", 8:"eight", 9:"nine"]

//一個數組
let numbers = [16, 58, 510]

//呼叫map函式,裡面傳入閉包
let strings = numbers.map{

//傳入一個number返回一個String
    (var number) -> String
in var output = "" while number > 0 { output = digitNames[number % 10]! + output//找到每一個數字,轉為字串 number /= 10 } return output }

值捕獲

首先閉包是引用型別
官方例子

///定義一個返回() -> Int 型別的函式
func makeIncrementor(forIncrement amount:Int) -> () -> Int {
    var runningTotal = 0

    //一個閉包函式
    func incrementor() -> Int {
        runningTotal += amount;
        return runningTotal
    }

    //返回這個閉包,此時這個閉包已經包含runningTotal和amount的值
    return incrementor
}
let incrementByTen1 = makeIncrementor(forIncrement: 10)

let incrementByTen2 = makeIncrementor(forIncrement: 1)


incrementByTen1()   //10 所以值會被閉包一直保留
incrementByTen1()   //20

incrementByTen2()   //1