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"
}
}
ストレージを導入するプロパティでプロパティをオーバーライドできない技術的な理由はありませんが(オブザーバーオーバーライドであいまいさを引き起こす可能性がありますが、 この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 }
}
}