2017-06-27 5 views
0

次のクラスのプロパティをオーバーライドします。ブール値のプロパティrを持つクラスAがあるとします。スーパークラスAについては、rを設定して正常に取得します。サブクラスBについては、rは常にfalseになります。私はこれがなぜ必要なよりも難しいのか分かりません...Swiftのオーバーライドプロパティ3

+4

コードはコンパイルされません。計算されたプロパティでプロパティオブザーバ( 'willSet')を使用することはできません。そして、コンパイルしたとしても、 'get {return r}'は再帰的ループを引き起こし、 'willSet'の実装は何もしません。おそらく、基本クラスに格納されたプロパティだけが必要で、サブクラスでは計算されたプロパティが上書きされます。 – Hamish

+0

格納されたプロパティを使用し、サブクラスでの計算でオーバーライドする方法を詳しく説明できますか?サブクラスで 'r'を常に' false'にします。 – 7ball

+1

「関連する」セクションで同様の質問を確認しましたか? –

答えて

4

私は、@Hamish:計算されたプロパティオーバーライドを持つベースクラスのストアドプロパティに同意します。ただし、読み取り専用プロパティは変更可能なプロパティをオーバーライドできません。しかし、オーバーライドされたセッターは何もせず、オーバーライドされたゲッターはあなたが望むものを返すことができます。

class A { 
    init(r: Bool) { 
     self.r = r 
    } 

    var r: Bool 
} 

class B: A { 
    override var r: Bool { 
     set {} 
     get { 
      return false 
     } 
    } 
} 

let a = A(r: true) 
print(a.r) // "true" 
a.r = false 
print(a.r) // "false" 

let b = B(r: true) 
print(b.r) // "false" 
b.r = true 
print(b.r) // "false"