次のような vararg メソッド呼び出しを使用して、NSArray (および NSDictionaries/NSNumber) を作成することは常に可能でした。
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
これらは、LLVM と Clang の新しい改善でインライン リテラルを使用して作成できますか?
次のような vararg メソッド呼び出しを使用して、NSArray (および NSDictionaries/NSNumber) を作成することは常に可能でした。
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
これらは、LLVM と Clang の新しい改善でインライン リテラルを使用して作成できますか?
LLVM コードベースへのこの変更により、Apple は Clang コンパイラの今後のバージョンでリテラルの新しい構文を追加しました。
以前は、配列は C ベースの配列を使用して作成され、次のような目的の C オブジェクトにオンザフライで変換されていました。
NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
これは varargs 要素であるため、リストの最後に「nil」を指定する必要があることに注意してください。ただし、今ではもっと簡単な方法があります。
NSArray* array = @[ @"One", @"Two", @"Three" ];
[] と通常の C 配列 (またはメッセージ送信) を区別するために、[] の前に @ が必要であることに注意してください。また、末尾の「nil」は不要になったことにも注意してください。
JSON 構造と同様に、インライン辞書リテラルにも同様の変更が加えられました。
NSDictionary* dict = @{
@"Key1": @"Value1",
@"Key2": @"Value2",
};
最後に、NSInteger (など) の新しいリテラルが追加されました。
NSNumber* value = @3.141;
これは浮動小数点 ( @3.141F
) と double ( @3.141
) では機能しますが、s では機能しないことに注意してくださいlong double
。これらは、コンパイラによるラッピングがサポートされていないためです。したがって、@3.141D
コンパイル時エラーになります。
定数の定義方法により、@INT_MAX
は有効な有効な値ですが、@INT_MIN
そうではありません。これは、後者がコンパイル時の式を介して定義され、それ自体がリテラルではないためです。
ブール型の拡張機能もあります。
NSNumber* yes = @YES; // [NSNumber numberWithBool:YES]
NSNumber* no = @NO; // [NSNumber numberWithBool:NO]
NSNumber* trueBool = @true; // [NSNumber numberWithBool:(BOOL)true]
NSNumber* falseBool = @false; // [NSNumber numberWithBool:(BOOL)false]
__objc_yes
この変更により、およびリテラルも導入され、__objc_no
リテラル値のみによる型の解析がサポートされました。それらの使用は#if __has_feature(objc_bool)
プリプロセッサで保護されていますが、開発者は引き続きコードで使用する必要がYES
ありNO
ます。
最後に、配列と辞書の両方に、配列ブラケットを使用して添字を付けることができるようになりました。 aslvalue
とrvalue
式の両方で使用できます。
NSMutableArray* stuff = ...
id first = stuff[0];
stuff[0] = anotherObject;
NSMutableDictionary* moreStuff = ...
id conference = moreStuff[@"NSConf"]
moreStuff[@"SponsoredBy"] = @"NSConfDuck"
配列スタイルの添え字 ( を使用) は対応する および にNSUInteger
マップされ、辞書へのアクセスはおよびでアクセスされます。objectAtIndexedSubscript:
setObject:atIndexedSubscript:
objectForKeyedSubscript:
setObject:forKeyedSubscript:
リテラルの完全な構文は、 Clang/LLVM Web サイトで確認できます。
この回答が最初に書かれて以来、Clang は「ボックス式」と呼ばれる非リテラルの Objective-C 式のサポートを追加したことに注意してください。
これは、 およびasと@(3+4)
同等に使用できることを意味します。に評価される C 式は例外になり、 などの引数はコンパイル時エラーとして扱われることに注意してください。@7
@("Hello World")
@"Hello World"
null
@(null)
型が既知の型に対して「Boxed enums」を使用することも可能です。
enum {北、南、東、西、};
を使用してボックス化された列挙型に配置でき@(North)
、値は になります0
。
ボックス式は、clang 3.2 以降で使用できます。__has_feature(objc_boxed_expressions)
プリプロセッサ テストを使用してテストできます。
NSNumber *intNumber1 = @42;
NSArray *array1 = @[@"foo", @42, @"bar", @3.14];
NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" };
ソース: http://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html