語(yǔ)法
以下定義了一個(gè)接收參數(shù)并返回指定類型的閉包語(yǔ)法:
{ (parameters) -> return type in
? statements
}
尾隨閉包
尾隨閉包是一個(gè)書(shū)寫(xiě)在函數(shù)括號(hào)之后的閉包表達(dá)式,函數(shù)支持將其作為最后一個(gè)參數(shù)調(diào)用
func someFunctionThatTakesAClosure(closure: () -> Void) {
?// 函數(shù)體部分
}
// 以下是不使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure( { // 閉包主體部分} )
// 以下是使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure() { // 閉包主體部分}
捕獲值
閉包可以在其定義的上下文中捕獲常量或變量。
即使定義這些常量和變量的原域已經(jīng)不存在,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值。
Swift最簡(jiǎn)單的閉包形式是嵌套函數(shù),也就是定義在其他函數(shù)的函數(shù)體內(nèi)的函數(shù)。
嵌套函數(shù)可以捕獲其外部函數(shù)所有的參數(shù)以及定義的常量和變量。
看這個(gè)例子:
func makeIncrementor(forIncrement amount: Int) -> () -> Int {??
? var runningTotal = 0? ?
?func incrementor() -> Int {? ? ?
? ? ? ? runningTotal += amount
? ? ? ? return runningTotal
? ? }? ?
?return incrementor
}
//定義閉包類型(特定的函數(shù)類型函數(shù)類型)
typealias InputClosureType = (String) -> Void
//接收上個(gè)頁(yè)面?zhèn)鬟^(guò)來(lái)的閉包塊
?var backClosure: InputClosureType?
//使用
self.backClosure!(tempString)
//回調(diào)
secondVC.backClosure = {
? ? ? ?(backStr: String) -> Void? ? in? ? ?
?? ? ? self.showTextLabel.text = backStr
?}