[英]How does self property refer to Instance object when using escaping closure ? (Swift 3)
這是一個例子:
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 }
}
}
let instance = SomeClass()
instance.doSomething()
當調用instance.doSomething()時,它會將閉包附加到數組completionHandlers.It變為:
var completionHandlers:= [{self.x = 100}]
當調用completionHandlers.first?()
,它調用{ self.x = 100 }
然后x變為100。
completionHandlers.first?()
print(instance.x)
// Prints "100"
我的問題是數組中的{ self.x = 100 }
像這樣: { instance.x = 100 }
? 我的意思是self
引用對象實例,即使我們在實例類之外使用它?
謝謝 !
在評論中,您要問:
在實例類中,
self.x
等於實例屬性x
。 當我們調用closure時,實例類之外是self.x
還是實例屬性x
?
是。 閉包內部的self
指的是創建閉包的對象,而不是最終調用閉包的對象(可能更晚)。 因此,如果對象A
將引用self.x
的閉包傳遞給另一個對象, B
,當B
調用該閉包時, self.x
仍然引用A
的x
屬性,而不是B
的屬性。
在回答原始問題時,是的,您可以參考您想要的任何實例。 它不一定是self
。
然而,你用這句話來抽象的抽象方式讓我有點懷疑。 這個“我可以更新任何其他實例”的問題引入了一些代碼味道的微弱暗示。 閉包模式的優點是你讓對象啟動一些動作來提供一個閉包,該閉包指示當另一個對象完成某個任務時,第一個對象應該發生什么,保持一切順利,松散耦合。
但是當你開始更新其他不相關的對象時,事情又開始變得更加緊密。 這一切都歸結為這個instance
是什么以及它與創造閉包的self
有什么關系。
但是,簡而言之,是的,您可以更新屬性或調用除self
其他項目的方法,但我們需要更好地了解這些不同的對象在這種情況下是否是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.