もちろん、didSetはdidSet内から同じオブジェクト上で再び実行されないことはよく知られています。 (example)内部クラスの保護は奇妙なことにクラス全体に及んでいますか?
ただし、それはそうだ:制限は、そのオブジェクトだけでなく、同じクラスの任意のオブジェクトに適用されます。
ここにはPlaygroundのコピー・ペースト・テスト・ケースがあります。
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
動作しません!
これはスウィフトバグですか?
は何ですか? didSetから始まるANY didSet(何でも)は実行されません。同じ同じクラス?同じスーパークラスですか?または?
これはdocoで正確に説明されていますか?
WTF。 1つは知っておく必要があります...特に実際の制限は何ですか?
理論上、子どもの1人はそれ自身である可能性があります。無限ループがまだ発生する可能性があることを意味します。バグかもしれない、機能かもしれないそれは答えではないので、それはコメントにある理由:) – PeejWeej
@JoeBlow:このコメントは[Swiftソースコード](https://github.com/apple/swift/blob /master/lib/AST/Decl.cpp#L1072)が関連している可能性があります:*「観察しているメンバーは、didSet/willSet指定子の中から直接アクセスします。これにより、割り当てが無限ループにならないようにします。 swift-usersメーリングリストでは、Swiftチームのメンバーが定期的に貢献しています。 –
これは同じ質問のように見えます:[なぜ、セットに無限ループがありますか?](http://stackoverflow.com/questions/29363170/why-no-infinite-loop-in-didset) –