簡體   English   中英

為什么在初始化程序中設置時調用 didSet?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM