Objective-Cのリテラル強化きた。
NSArray *array =int値、float値や BOOL値 に @ を付けると NSNumberに変更される。
[NSArray arrayWithObjects: @0, @23, @3.1415, @YES, nil];
以下、上記サイトからの紹介。
※今回の新しいリテラル表記は clang trunk(clangの最新コード)の話で現在の Xcodeではまだ使えない。
NSArrayの初期化で @[]表記が使える。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];
NSArray配列に []でアクセスが。
NSArray *gronk = @[ @"hi", @"bork", @23, @YES ];
NSLog (@"gronk 0: %@", gronk[0]);
NSLog (@"gronk 2: %@", gronk[2]);
入れ子
NSArray *nesting = @[ @"hi", @[ @"ohai" ] ];
NSLog (@"nesting: %@", nesting[1][0]);
-> nesting: ohai
NSMutableArrayなら代入も可能
mutt[0] = @"aaa";さらにインデックスが範囲外の場合、自動的にインサート(insertObject:index:)される。
mutt[3] = @"d";
mutt[4] = @"e";
次に NSDictionary の初期化。"キー:値" 表記が可能に。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };
NSLog (@"splunge %@", splunge);
->splunge {
greeble = bork;
hi = bork;
}
今までのを組み合わせるとこれが
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSFont userFontOfSize: 150.0], NSFontAttributeName, [NSNumber numberWithFloat: 3.0], NSStrokeWidthAttributeName, [NSColor blueColor], NSStrokeColorAttributeName, [NSNumber numberWithInt: 10], NSKernAttributeName, [NSNumber numberWithFloat: 0.5], NSObliquenessAttributeName, nil];こうなる
NSDictionary *attributes = @{ NSFontAttributeName : [NSFont userFontOfSize: 150.0], NSStrokeWidthAttributeName : @3.0, NSStrokeColorAttributeName : [NSColor blueColor], NSKernAttributeName : @10, NSObliquenessAttributeName : @0.5 };すっきりしてわかりやすい。
NSDictionaryへのアクセスは [@キー]が使える。
NSDictionary *splunge = @{ @"hi" : @"bork", @"greeble" : @"bork" };
NSLog (@"%@", splunge[@"greeble"]);
NSLog (@"%@", splunge[@"ACK"]);
入れ子
NSDictionary *nest = @{ @"hi" : @"ohai",
@"ichc" : @{ @"oop" : @"ack"} };
NSLog (@"nest: %@", nest);
NSLog (@"noost: %@", nest[@"ichc"][@"oop"]);
NSLog (@"nist: %@", nest[@"ichc.oop"]); // try a key path
なお staticな宣言では利用できない。例えば下記はNG
#import
NSString *thing = @"thing 1";
NSArray *array = @[ @"thing 2" ];
@implementation BNRGroovyObject
...
- - - -
大幅なリテラル表記の新規追加はいまさら感もあるがコーディングが楽になるし可読性が増すので歓迎したい。しかし ARC導入といい、数年前の Objective-C コードとの断絶が出てきた。いっそのこと ARCと新リテラル表記で Objective-C 3.0 にした方が良かったと思うくらい。