一個樸實無華的目錄
- 今日學習內容:
- 1.Swift 閉包
- 1.1閉包定義
- 1.2閉包實例
- 1.3閉包表達式
- 1.3.1sorted 方法:據您提供的用于排序的閉包函數將已知類型數組中的值進行排序。
- 1.3.2參數名稱縮寫:直接通過$0,$1,$2來順序調用閉包的參數。
- 1.3.3運算符函數
- 1.4尾隨閉包:書寫在函數括號之后的閉包表達式
- 1.5捕獲值:嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量。
今日學習內容:
1.Swift 閉包
1.1閉包定義
閉包(Closures)是自包含的功能代碼塊,可以在代碼中使用或者用來作為參數傳值。
1.2閉包實例
import Cocoalet studname = { print("Swift 閉包實例。") }
studname()
import Cocoalet divide = {(val1: Int, val2: Int) -> Int in return val1 / val2
}
let result = divide(200, 20)
print (result)
1.3閉包表達式
1.3.1sorted 方法:據您提供的用于排序的閉包函數將已知類型數組中的值進行排序。
返回一個與原數組大小相同,包含同類型元素且元素已正確排序的新數組。
import Cocoalet names = ["AT", "AE", "D", "S", "BE"]// 使用普通函數(或內嵌函數)提供排序功能,閉包函數類型需為(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {return s1 > s2
}
var reversed = names.sorted(by: backwards)print(reversed)以上程序執行輸出結果為:["S", "D", "BE", "AT", "AE"]
1.3.2參數名稱縮寫:直接通過$0,$1,$2來順序調用閉包的參數。
import Cocoalet names = ["AT", "AE", "D", "S", "BE"]var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)
1.3.3運算符函數
import Cocoalet names = ["AT", "AE", "D", "S", "BE"]var reversed = names.sorted(by: >)
print(reversed)
1.4尾隨閉包:書寫在函數括號之后的閉包表達式
import Cocoalet names = ["AT", "AE", "D", "S", "BE"]//尾隨閉包
var reversed = names.sorted() { $0 > $1 }
print(reversed)
1.5捕獲值:嵌套函數可以捕獲其外部函數所有的參數以及定義的常量和變量。
incrementor實際上捕獲并存儲了該變量的一個副本,而該副本隨著incrementor一同被存儲。
所以我們調用這個函數時會累加
import Cocoafunc makeIncrementor(forIncrement amount: Int) -> () -> Int {var runningTotal = 0func incrementor() -> Int {runningTotal += amountreturn runningTotal}return incrementor
}let incrementByTen = makeIncrementor(forIncrement: 10)// 返回的值為10
print(incrementByTen())// 返回的值為20
print(incrementByTen())// 返回的值為30
print(incrementByTen())
如果您將閉包賦值給了兩個不同的常量/變量,兩個值都會指向同一個閉包:
import Cocoafunc makeIncrementor(forIncrement amount: Int) -> () -> Int {var runningTotal = 0func incrementor() -> Int {runningTotal += amountreturn runningTotal}return incrementor
}let incrementByTen = makeIncrementor(forIncrement: 10)// 返回的值為10
incrementByTen()// 返回的值為20
incrementByTen()// 返回的值為30
incrementByTen()// 返回的值為40
incrementByTen()let alsoIncrementByTen = incrementByTen// 返回的值也為50
print(alsoIncrementByTen())