2016-08-10 2 views
3

アクセサーを観察してストアド・プロパティを作成する場合、デフォルト値を指定できます。しかし、ストアドプロパティとそのアクセサをオーバーライドするとき、私はデフォルト値を指定することはできません。getter/setterを使用する変数は、オーバーライドされたストアド・プロパティでは初期値を持てません。

getter/setterを使用する変数には初期値を設定できません。

これはgetter/setterを持つ計算されたプロパティではなく、ストアされたプロパティのオブザーバのオブザーバのセットですので、非常に奇妙です。

class FirstViewController: UIViewController { 

internal var test: Float = 32.0 { 
    willSet { 

    } 

    didSet { 

    } 
} 

最初のビューコントローラは、「計算プロパティが」初期値

与えられているように、第2のビューコントローラは、コンパイルされない32.0

class SecondViewController: FirstViewController { 

override var test: Float = 64.0 { 
    willSet { 

    } 

    didSet { 

    } 
} 

に初期化格納された特性を有する、微細コンパイル

答えて

4

即座に、同じタイプの計算されたプロパティ(デフォルト値を持つことができない)だけでプロパティを上書きすることができます。あなたはSecondViewControllerでオーバーライドtestプロパティを希望する場合は、あなたのケースでは、このような何か書く必要があります。

override var test: Float { 
    get { 
     return super.test 
    } 
    set { 
     super.test = newValue 
    } 
} 

を直接didSet/willSetオブザーバーを上書きする方法はありません。あなたはオブザーバーで呼び出された書き込み、他の方法でこれを行うと、ちょうどそれらオーバーライドすることがあります。

FirstViewController:

internal var test: Float = 32.0 { 
    willSet { 
     test_WillSet(newValue) 
    } 
    didSet { 
     test_DidSet(oldValue) 
    } 
} 

func test_WillSet(newValue: Float) {} 
func test_DidSet(oldValue: Float) {} 

SecondViewController:

override func test_WillSet(newValue: Float) { 
    super.test_WillSet(newValue) 
} 
override func test_DidSet(oldValue: Float) { 
    super.test_DidSet(oldValue) 
} 
関連する問題