繁体   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