これは罰金コンパイル:なぜ、will/didSetトリガイニシャライザエラーですが、通常のset/getではありませんか?
class Foo {
var number = 0
var name: String
init(name: String){ self.name = name }
}
class SubFoo: Foo {
init(_ x: Int){
super.init(name: "abc")
}
var a: Int {
set {}
get {
return 0
}
}
}
a
は、計算されたプロパティであるため、初期化を必要としません。
しかし、これはコンパイルされません:
class SubFoo: Foo {
init(_ x: Int){
super.init(name: "abc")
}
var a: Int {
willSet {}
didSet {
print(oldValue)
}
}
}
をSubFooのinitメソッドがこれを示しています
error: property 'self.a' not initialized at super.init call super.init(name: "sdf")
a
はまだ "本物" のプロパティではありませんので、コンパイラは、ここで正確に何を期待していますか?
不思議私はこれを行うことによって、エラーを消すことができます。
init(_ x: Int){
a=0
super.init(name: "sdf")
}
はなぜ
a=0
は、通常の
set
を
willSet
ために必要ではないでしょうか?
'a'は、2番目の例では、計算されていない格納されたプロパティです。 'willSet'と' didSet'は単なるオブザーバーです。 – Hamish
@ハミッシュそれは非常に面白いです、私はこれらのすべてのプロパティメソッドが "計算された"と思った – johnbakers
私はこれが構文のデザインミスであると常に考えてきました。これらの2つは、機能の大きな違いを考えると似ています。オブザーバーが別々に宣言された場合、または少なくとも角括弧の中に入れられていない場合は、それを好むでしょう。 –