首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >结构不对新对象调用属性观察器

结构不对新对象调用属性观察器
EN

Stack Overflow用户
提问于 2018-06-02 20:18:10
回答 2查看 295关注 0票数 2

在这段代码中,我希望在创建新对象时调用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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-02 20:30:52

您可以构造一个自定义初始化器,如下所示。

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
EN

Stack Overflow用户

发布于 2018-06-02 21:10:36

它的目的是在初始化器中不调用属性观察器。考虑下面的代码;如果将此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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50656861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档