W tym kodzie chciałbym mieć nazwę property observers, gdy nowy obiekt zostanie utworzony. Jak to osiągnąć?

Oto, co mam do tej pory:

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
-1
George_E 2 czerwiec 2018, 15:18

3 odpowiedzi

Najlepsza odpowiedź

Możesz skonstruować niestandardowy inicjator w następujący sposób.

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
2 czerwiec 2018, 13:14

To dlatego, że pierwszy jest tworzeniem instancji - nie jesteś ustawiony nieruchomości, jak sugeruje nazwę. Jeśli potrzebujesz czegoś, co się wydarzy na tworzeniu instancji, zrób to w takiej metodzie INIC:

struct MyStruct {
    init(myValue: Int) {
        self.myValue = myValue
        doSomething()
    }
}
1
Vasil Garov 2 czerwiec 2018, 12:29

Jest celowo, że obserwatorzy nieruchomości nie są wywoływani inicjalizatorom. Rozważ poniższy kod; Program rozbiłby się, jeśli zrobiono to struct. To dlatego, że obserwatorzy mają dostęp do innych nieruchomości, zanim zostały ustawione. Z tego powodu wybrano go nie posiadać obserwatorów z inicjujących.

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
    }
}

Aby to obejść, możesz utworzyć funkcję, którą dzwonisz zarówno z obserwatorów, jak i inicjatora, albo możesz spojrzeć na To.

1
Andreas -he-her- 1 październik 2018, 07:41