通用的語法git
{(parameters) -> return type in statements }
e.gswift
let studname = { println("Welcome to Swift Closures") } studname()
輸出閉包
Welcome to Swift Closures
如下閉包接受兩個參數並返回一個布爾值:ide
{(Int, Int) -> Bool in Statement1 Statement 2 --- Statement n }
e.g函數
let divide = {(val1: Int, val2: Int) -> Int in return val1 / val2 } let result = divide(200, 20) println (result)
輸出spa
10
e.gcode
func ascend(s1: String, s2: String) -> Bool { return s1 > s2 } let stringcmp = ascend("swift", "great") println (stringcmp)
輸出blog
true
e.g內存
let sum = {(no1: Int, no2: Int) -> Int in return no1 + no2 } let digits = sum(10, 20) println(digits)
輸出rem
30
sorted比較e.g
let count = [5, 10, -6, 75, 20] var descending = sorted(count, { n1, n2 in n1 > n2 }) var ascending = sorted(count, { n1, n2 in n1 < n2 }) println(descending) println(ascending)
輸出
[75, 20, 10, 5, -6] [-6, 5, 10, 20, 75]
考慮兩個數相加。咱們知道相加後將返回整數數據類型。所以,已知類型的閉包聲明
let sub = {(no1: Int, no2: Int) -> Int in return no1 - no2 } let digits = sub(10, 20) println(digits)
-10
Swift 自動提供簡寫參數名內聯閉包, 可使用由 $0,$1,$2 等等名稱,指的是封閉的參數值。
var shorthand: (String, String) -> String shorthand = { $1 } println(shorthand("100", "200"))
200
Swift 方便用戶來表示內嵌閉包爲縮寫參數名爲:$0, $1, $2 --- $n.
閉包參數列表中被省略定義部分,當咱們表示內部閉包表達式簡寫參數名。 根據函數類型簡寫參數名稱將被導出。因爲簡寫參數表達體所定義的 'in' 關鍵字被省略。
let numb = [98, -20, -30, 42, 18, 35] var sortedNumbers = numb.sorted({ (left: Int, right: Int) -> Bool in return left < right }) let asc = numb.sorted(<) println(asc)
[-30, -20, 18, 35, 42, 98]
reversed = sorted(names) { $0 > $1}
其中 {$0 > $1} 表示爲外部(名稱)聲明尾隨閉包。
import Foundation var letters = ["North", "East", "West", "South"] let twoletters = letters.map({ (state: String) -> String in return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString }) let stletters = letters.map() { $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString } println(stletters)
[NO, EA, WE, SO]
在閉包的幫助下 Swift 完成捕捉常量和變量的值。它還參考修改值,即便常量和變量在閉包體已經不存。
let decrem = calcDecrement(forDecrement: 18) decrem()
在這裏,oneDecrement 和 遞減變量都指向同一個內存塊閉合參考。
func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 100 func decrementer() -> Int { overallDecrement -= total println(overallDecrement) return overallDecrement } return decrementer } let decrem = calcDecrement(forDecrement: 18) decrem() decrem() decrem()
82 64 46