Хорошо известно, что, разумеется, didSet не будет запускаться на одном и том же объекте изнутри didSet. (example.)Внутренняя защита didSet причудливо распространяется на весь класс?
Однако. Кажется, что: ограничение распространяется не только на этот объект, но, возможно, на любой объект того же класса.
Здесь приведены примеры для копирования-вставки для игровой площадки.
class C {
var Test: Bool = false {
didSet {
print("test.")
for c in r {
c.Test = true
}
}
}
var r:[C] = []
}
var a:C = C()
var b:C = C()
var c:C = C()
a.r = [b, c]
a.Test = false
Не работает!
class C {
var Test2: Bool = false {
didSet {
print("test2.")
global.Test2 = true
}
}
}
var global:C = C()
var a:C = C()
a.Test2 = false
Не работает!
Является ли это быстрой ошибкой?
Если нет, что такое фактическое ограничение? Он не будет запускать ANY didSet (что бы то ни было), который начинается с didSet ?; один и тот же класс ?; тот же суперкласс ?; или?
Где именно это объясняется в doco?
WTF. Нужно знать ... каково фактическое ограничение конкретно?
Теоретически один из детей может быть сам собой. что означает бесконечный цикл. Может быть, ошибка, может быть особенность. Это не ответ, поэтому причина в комментариях :) – PeejWeej
@JoeBlow: этот комментарий в исходном коде Swift (https://github.com/apple/swift/blob /master/lib/AST/Decl.cpp#L1072) может быть релевантным: * «Наблюдающий элемент доступен непосредственно из своих спецификаторов didSet/willSet, что предотвращает контировки от бесконечных циклов». * Вы также можете попытаться задать список рассылки быстрых пользователей, где люди из команды Swift регулярно вносят свой вклад. –
Это похоже на тот же вопрос: [Почему нет бесконечной петли в didSet?] (Http://stackoverflow.com/questions/29363170/why-no-infinite-loop-in-didset). –