swift-閉包(代碼塊)

語法

 通用的語法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
相關文章
相關標籤/搜索