Почему вызывается didSet, если он установлен внутри инициализатора? - PullRequest
5 голосов
/ 23 декабря 2019

Я играю с SwiftUI, и у меня есть класс, который выглядит примерно так:

class Foo: ObservableObject {

    @Published var foo: Int! { // Implicit unwrapped optional
        didSet {
            print("foo")
        }
    }

    init() {
        self.foo = 1
    }
}

DidSet всегда вызывается. Согласно Apple Docs это не должно называться. Что-то особенное происходит с оболочкой свойства @Published?

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

Все о типах ... Хорошо, давайте рассмотрим код ...

case 1: @Published var foo: Int

на самом деле

var foo: Int
var _foo: Published<Int>

так

init() {
    self.foo = 1 // << Initialization
}

дело 2: @Published var foo: Int! (то же самое будет для @Published var foo: Int?)

на самом деле

var foo: Int!
var _foo: Published<Int?> // !! Not primitive - generics class, types differ

так

init() {
    self.foo = 1 // << Assignment of Int(1)
}

Таким образом, ИМО, ответ - да, это что-то особенное в @Published.

Примечание : Вы можете видеть все изображение во время выполнения, если установить точку останова на линии self.foo = 1 и использовать ^ F7 (Control-Step Into), чтобы выполнить инструкции для обоих случаев ... очень интересные внутренности.

0 голосов
/ 23 декабря 2019

Нашел ответ здесь, при использовании неявной развернутой переменной он оставляет инициализированную область видимости, для которой didSet называется: https://stackoverflow.com/a/25231068/294661

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...