结构不在新对象上调用属性观察者
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 自定义事件,而不在每个屏幕中传递“分析/观察者”对象