web-dev-qa-db-ja.com

Swiftの保存されたプロパティでオーバーライドできません

Swift 4.1でlazy varをオーバーライドする正しい方法は何ですか?次のコードはSwift 4.0で問題なく動作しますが、Swift = 4.1オーバーライドに関する警告があるので、Swift 5

以前はよく__していた:

class A {

    lazy var myVar: String = {
        return "A"
    }()
}

class B: A {

    override lazy var myVar: String = { // WARNING Cannot override with a stored property myVar
        return "B"
    }()
}

私はこれがこのようなものだと思いますが、セクシーではありません。

class A {

    lazy var myVar: String = {
        return createMyVar()
    }()

    func createMyVar() -> String {
        return "A"
    }
}

class B: A {

    override func createMyVar() -> String {
        return "B"
    }
}
10
Arnaud Dorgans

ストレージを導入するプロパティでプロパティをオーバーライドできない技術的な理由はありませんが(オブザーバーオーバーライドであいまいさを引き起こす可能性がありますが、 このQ&Aの詳細 を参照)、Swiftは現在そうすることができます。

4.0では、プロパティをlazyプロパティでオーバーライドできるという事実 意図しない (オーバーライドによりストレージが導入されるため)で、4.1で警告が表示され、 Swift 5モードは、ソースの互換性を維持するために( #13304 で実装されています)。

ただし、転送計算プロパティを使用しても同じ結果を得ることができます。

class A {
  lazy var myVar: String = "A"
}

class B : A {

  // Note that this isn't a particulary compelling case for using 'lazy', as
  // the initialiser expression is not expensive.
  private lazy var _myVar: String = "B"

  override var myVar: String {
    get { return _myVar }
    set { _myVar = newValue }
  }
}
12
Hamish