Структура не вызывает свойства наблюдателей на новый объект - PullRequest
0 голосов
/ 02 июня 2018

В этом коде я бы хотел, чтобы 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

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Вы можете создать собственный инициализатор следующим образом.

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 
0 голосов
/ 02 июня 2018

Это специально, чтобы наблюдатели свойств не вызывались в инициализаторах.Рассмотрим код ниже;программа будет аварийно завершена, если этот 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
    }
}

Чтобы обойти это, вы можете создать функцию, которую вы вызываете как из наблюдателей, так и из инициализатора, или вы можете посмотреть это .

0 голосов
/ 02 июня 2018

Это потому, что первым является экземпляр создание - вы не устанавливаете свойство, как следует из названия.Если вам нужно, чтобы что-то произошло при создании экземпляра, просто сделайте это в методе init следующим образом:

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