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