![](/img/trans.png)
[英]Why is 'didset' called on a property when I set the property of that property?
[英]Why is didSet called when set inside an initializer?
我在玩 SwiftUI,我有一個看起來像這樣的類:
class Foo: ObservableObject {
@Published var foo: Int! { // Implicit unwrapped optional
didSet {
print("foo")
}
}
init() {
self.foo = 1
}
}
didSet 總是被調用。 根據Apple 文檔,不應調用它。 @Published
屬性包裝器有什么特別之處嗎?
所有關於類型......好吧,讓我們考慮代碼......
情況 1: @Published var foo: Int
實際上是
var foo: Int
var _foo: Published<Int>
所以
init() {
self.foo = 1 // << Initialization
}
情況 2: @Published var foo: Int!
( @Published var foo: Int?
)
實際上是
var foo: Int!
var _foo: Published<Int?> // !! Not primitive - generics class, types differ
所以
init() {
self.foo = 1 // << Assignment of Int(1)
}
因此,IMO,答案是肯定的,這是@Published 的特別之處。
注意:如果在self.foo = 1
行設置斷點並使用 ^F7 (Control-Step Into) 執行兩種情況下的指令,您可以在運行時看到所有圖片......非常有趣的內部結構。
在這里找到答案,當使用隱式解包變量時,它會離開初始化范圍,因此 didSet 被稱為: https ://stackoverflow.com/a/25231068/294661
規則是在初始化期間不調用 setter 觀察者。 但是當你設置這個屬性時,初始化就結束了! 該屬性已被賦予其初始值,即nil
。 因此,即使您在init
方法中,您也不是“在初始化期間”並且 setter 觀察者運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.