swift - 为什么在初始化程序中设置时调用 didSet?

标签 swift swiftui

我在玩 SwiftUI,我有一个看起来像这样的类:

class Foo: ObservableObject {

    @Published var foo: Int! { // Implicit unwrapped optional
        didSet {
            print("foo")
        }
    }

    init() {
        self.foo = 1
    }
}

didSet 总是被调用。根据 Apple docs它不应该被调用。 @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)按照说明进行两种情况......非常有趣的内部结构。

关于swift - 为什么在初始化程序中设置时调用 didSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59448624/

相关文章:

SwiftUI 中事件触发的动画

swift - 在 Swift 中将闭包作为参数传递给递归函数

ios - 在 SwiftUI 中使用 LazyVGrid 替代背景颜色

ios - UIPageViewController 滑动忽略 SwiftUI 的 navigationBarHidden(true)

swift - 菜单标题问题和不透明度降低

ios - 如何在 IOS 上制作可定制的 View ? (我使用 style.id 作为 android View 类构造函数的参数)

swift - 为什么我的图片下载后没有立即显示?

swift - swift代码的返回类型

swift - 没有推送通知实现时缺少推送通知授权错误

ios - 如何仅检索当天的日历事件?