因此,這段代碼是一個逃避關閉,我也明白,它的@escaping是必需的,因爲函數轉義和追加或變更完成處理。爲什麼值類型不需要@escaping或顯式自我而不是轉義閉包?
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping() -> Void) {
completionHandlers.append(completionHandler)
}
func someFunctionWithNonescapingClosure(closure:() -> Void) {
closure()
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 }
someFunctionWithNonescapingClosure { x = 200 }
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"
completionHandlers.first?()
print(instance.x)
// Prints "100」
然而,這個簡單的代碼並不要求值類型被標記爲轉義,即使它改變了變量x。
var x: Int = 0
func x (y: Int) {
x += y
}
x (y: 7)
print (x)
這混淆了我,因爲我不明白,爲什麼在第二個自代碼可以隱式評估,但有逃避關閉的自我要求(如果它被稱爲)。
在你的第二個例子中,沒有閉合。所以沒有什麼可以標記爲'@ escaping'。這只是一個函數(儘管像你的變量一樣將'x'命名爲混淆)。只有關閉參數需要標記爲'@ escaping'。也許我不明白你的問題... – Rob