Properties

age++ //=> Unary operator '++' cannot be applied to an operand of type '@lvalue Int'

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Properties.html を読む。

  • structインスタンスletならプロパティがvarでも値変更できない=>コンパイルエラー
  • クラスのインスタンスletでもプロパティがvarなら値を変更できる
  • 遅延プロパティは lazy 修飾子を宣言の前につける
    • lazy ならvarである。letlazyにできない
    • 遅延プロパティが有益なのは
      • 初期値が外部要因に依存しててインスタンスの初期化時に決まらない時
      • 初期値を決めるのに複雑計算量が多い時
    • 遅延プロパティにマルチスレッドで同時にアクセスしたとき一度しか初期化されないという保証はない
  • プロパティ値をインスタンス変数に保持しておく Objective-C みたいなやりかたはやらない
  • 計算型プロパティのsetterのパラメータ名指定は set(パラメータ名) デフォルトのパラメータ名は newValue
  • 読み取り専用の計算型プロパティであっても宣言は var
  • オブザーバーとは willSetdidSet
    • 新しい値がプロパティの現在の値と同じであっても、プロパティの値が設定されるたびに呼び出される
    • 定義できるのは lazy プロパティ以外
    • サブクラスでオーバーライドできる
    • willSet のデフォルトパラメータ名は newValue
    • didSet のデフォルトパラメータ名は oldValue
    • superクラスの初期化が終わった後、subクラスの初期化中、superクラスのプロパティのオブザーバーは呼び出される
    • クラス自身のプロパティ設定中、superクラスの初期化が呼ばれる前は、呼び出されない
    • inout宣言されたfuncの引数にプロパティを渡すとオブザーバーがいつも呼び出される
  • グローバル定数・変数がつかえる…のを今知った
    • いつも遅延評価される。lazy修飾子をつける必要は無い。つけたらコンパイルエラー
    • ローカル定数変数は決して遅延評価されない
    • 計算型にできる、オブザーバーを定義できる
  • 型プロパティは要するに static のこと
    • 初期化子が無いのでデフォルト値が必要
    • マルチスレッドで同時にアクセスしても一度だけしか初期化されないことが保証されている
    • staticではなくclassキーワードを使うとサブクラスでオーバーライドできる