Я наблюдал за поведением, которое я не совсем понимаю. При выполнении этого кода в детской площадке:willSet/didSet вызвал сохраненное свойство контейнера x при настройке свойства x
protocol Testp {
var notes: String { get set }
}
class Testc: Testp {
var notes: String = "x"
}
class TestContainer {
var test: Testp = Testc() {
willSet {
print("willSet")
}
didSet {
print("didSet")
}
}
}
var testContainer = TestContainer()
print(testContainer.test.notes) // prints "x"
// this triggers a willSet+didSet call on TestContainer's
// stored property, even though "test" is not changed in testContainer
testContainer.test.notes = "y"
print(testContainer.test.notes) // prints "y"
Как отметил выше, willSet
и didSet
блоки называются даже если сам объект недвижимости не установлен.
С другой стороны, если я изменить протокол быть класса типа, как следовать
protocol Testp: class {
var notes: String { get set }
}
то результат, как я бы ожидать, что она не будет (т.е. не вызов willSet/didSet
).
В чем причина такого поведения?
Я запускаю это на XCode 7.3.
Обновление: Тем не менее, в XCode 9.2/Swift 4
Вы когда-нибудь разрешали это? См. Ту же проблему. – tombardey
Я эгоистично рад наконец-то увидеть, как кто-то еще попал в контекст, где это вызвало проблемы;) Извините, но нет, я никогда не решал это иначе, чем делать что-то по-другому. – CMont