このブログを読んでいる間、作家はそれを言います
NSArray *array = @[ @"one", @"two" ];
上記の配列がグローバル変数の場合、エラーになります。その理由は
これは、@[]構文が文字通りNSArrayメソッドの呼び出しに変換されるためです。コンパイラはコンパイル時にそのメソッドの結果を計算できないため、このコンテキストでは正当な初期化子ではありません。
私の質問は、メソッド内の同じ宣言がどのように有効になるのかということです。
このブログを読んでいる間、作家はそれを言います
NSArray *array = @[ @"one", @"two" ];
上記の配列がグローバル変数の場合、エラーになります。その理由は
これは、@[]構文が文字通りNSArrayメソッドの呼び出しに変換されるためです。コンパイラはコンパイル時にそのメソッドの結果を計算できないため、このコンテキストでは正当な初期化子ではありません。
私の質問は、メソッド内の同じ宣言がどのように有効になるのかということです。
配列リテラル構文は次のように変換されます。
NSString *vals[2] = { @"one", @"two" };
[NSArray arrayWithObjects:vals count:2];
グローバルとスタティックは、コンパイル時の定数でのみ初期化できます。上記はコンパイル時定数ではありません。実行時にのみ評価できます。
通常の変数は実行時に初期化できるため、値はコンパイル時定数である必要はありません。
静的またはグローバルの1つのオプションはinitialize
、クラスのメソッドで初期化することです。
static NSArray *array = nil;
+ (void)initialize {
if (self == [ThisClass class]) {
array = @[ @"one", @"two", nil];
}
}
完全にはわかりませんが、グローバル変数はコンパイル時に初期化できる必要があるため、コンパイラーはそれを計算できる必要がありますが、メソッド内の変数は実行時まで計算されないため、その構文を使用します。