结构不在新对象上调用属性观察者

Posted

技术标签:

【中文标题】结构不在新对象上调用属性观察者【英文标题】:Struct not calling property observers on new object 【发布时间】:2018-06-02 12:18:09 【问题描述】:

在这段代码中,我希望在创建新对象时调用property observers。我如何做到这一点?

这是我目前所拥有的:

struct MyStruct 
    var myValue: Int 
        willSet 
            print("willSet")
        
        didSet 
            print("didSet")
        
    


var abc = MyStruct(myValue: 3) // Does not use property observers
abc.myValue = 5 // Calls property observers

【问题讨论】:

Is it possible to allow didSet to be called during initialization in Swift?的可能重复 【参考方案1】:

您可以按如下方式构造自定义初始化程序。

struct MyStruct 
    var myValue: Int 
        willSet 
            print("willSet")
        
        didSet 
            print("didSet")
        
    

    init(value: Int) 
        myValue = value
        // print something here
    


var abc = MyStruct(value: 3) 
abc.myValue = 5 

【讨论】:

【参考方案2】:

这是因为第一个实例是 creation - 您并没有像名称所暗示的那样设置该属性。如果您需要在创建实例时发生某些事情,只需在 init 方法中执行,如下所示:

struct MyStruct 
    init(myValue: Int) 
        self.myValue = myValue
        doSomething()
    

【讨论】:

【参考方案3】:

在初始化程序中不调用属性观察器是故意的。考虑下面的代码;如果将此struct 作为实例,程序将崩溃。这是因为观察者在设置之前访问了其他属性。因此,选择不让观察者从初始化程序中运行。

struct Struct 

    var p1: Int  didSet  p2 = p3 * 2  
    var p2: Int  didSet  p1 = p3 / 2  
    var p3: Int

    init(_ p1: Int, _ p2: Int, _ p3: Int) 
        self.p1 = p1 // The program crashes at this point, because `p3` was not yet set.
        self.p2 = p2
        self.p3 = p3
    

为了避免这种情况,您可以创建一个从观察者和初始化程序都调用的函数,或者您可以查看this。

【讨论】:

以上是关于结构不在新对象上调用属性观察者的主要内容,如果未能解决你的问题,请参考以下文章

使用jasmine.SpyObj-Angular / Jasmine测试服务属性上的可观察对象

如何在 Flutter 中设置 Firebase Analytics 自定义事件,而不在每个屏幕中传递“分析/观察者”对象

手动实现KVO

Vue.js:如何在组件初始化时触发观察器函数

Vue对象数据收集依赖具体流程

深入 Laravel 内核之观察者模式