閉包是功能性自包含模塊,可以在代碼中被傳遞和使用。 Swift 中的閉包與 C 和 Objective-C 中的 blocks 以及其他一些編程語言中的 lambdas 比較相似。
閉包的形式主要有三種:
1. 全局函數是一個有名字但不會捕獲任何值的閉包
2. 嵌套函數是一個有名字並可以捕獲其封閉函數域內值的閉包
3. 閉包表達式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的沒有名字 的閉包
Swift 的閉包表達式擁有簡潔的風格,並鼓勵在常見場景中以實現語法優化,主要優化如下:
* 利用上下文推斷參數和返回值類型
* 單表達式(single-expression)閉包可以省略 return 關鍵字
* 參數名稱簡寫
* Trailing 閉包語法 (結尾閉包)
嵌套函數:
var nums = [1,9,2,8] func testF(num1 : Int, num2 : Int) -> Bool{ return num1 > num2 } sort(&nums, testF) println(nums)//[9, 8, 2, 1]
沒有優化的閉包表達式:
var nums = [1,9,2,8] sort(&nums,{(num1:Int,num2:Int) -> Bool in //in 參數以及返回值與閉包主體的分割線 return num1 > num2 }) println(nums)//[9, 8, 2, 1]
簡化閉包函數表達式:(語法優化)
var nums = [1,9,2,8] sort(&nums,{(num1,num2) in //in 參數以及返回值與閉包主體的分割線 return num1 > num2 }) println(nums)//[9, 8, 2, 1]
再簡
var nums = [1,9,2,8] sort(&nums,{ $0 > $1})//$0代表第一個參數,$1代表第二個參數 println(nums)//[9, 8, 2, 1]
再簡
var nums = [1,9,2,8] sort(&nums,>)// 直接使用Swift的數組中的類型定義的關於大於號 (>) 的實現 func >(lhs: Int, rhs: Int) -> Bool println(nums)//[9, 8, 2, 1]
Trailing 閉包語法 (結尾閉包)
當一個閉包表達式作為最後一個參數傳遞給函數,我們可以使用結尾閉包來增強可讀性,上面的例子也可按照下面的寫法來寫:
var nums = [1,9,2,8] //這種寫法 sort(&nums){ num1,num2 -> Bool in //in 參數以及返回值與閉包主體的分割線 return num1 > num2 } //這種寫法 sort(&nums){ return $0 > $1 } //但是如果使用的是已聲明的函數的話,只能這種 sort(&nums,>) println(nums)//[9, 8, 2, 1]
比如數組的過濾可以簡便的這樣寫:
var nums = [1,9,2,8] var test = nums.filter { num -> Bool in return num%3 == 0//過濾掉不能被3整除的數 } println(test)//[9] var test = nums.filter { return $0%3 == 0//過濾掉不能被3整除的數 }