【swift-總結】閉包
阿新 • • 發佈:2019-02-18
其實閉包就是函式
作為條件的函式
閉包表示式
首先宣告一個數組
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