Obj-Cの可変配列を簡潔に記述

Xcode4.4(?)からObjective-Cで配列や連想配列の初期化にリテラル記法が使えるようになっています。

文字列については、もともと NSString *s = @"ABC"; といった簡潔な書き方ができていたのですが、同じような記法が、NSArrayやNSDictionary、NSNumberについても出来るようになっています。

 

以前はNSArrayのインスタンス生成を次のように書いていました。


NSArray *a = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil];

それが、次のように簡潔に書けるようになっています。(もちろん今までの書き方も出来ます)


NSArray *a = @[@"A", @"B", @"C"];

NSDictionaryは次のように書けます。


NSDictionary *d = @{@"Name":@"Yamada", @"Job":@"Programmer"};

NSNumberは次のように書けます。


NSNumber *n1 = @123;		// [NSNumber numberWithInt:123] 
NSNumber *n2 = @123.45f;	// [NSNumber numberWithFloat:123.45f] 
NSNumber *b = @YES;		// [NSNumber numberWithBool:YES]

 

このようにかなり簡潔に書けるようになっているんですが、とある記事を読んでいたら可変配列について面白い記述の仕方がされていました。

可変配列にはリテラル記法が無いので、普通は


NSMutableArray *ma = [[NSMutableArray alloc] init];

といった書き方になるのですが、その記事では、


NSMutableArray *ma = [@[] mutableCopy]; 

といった書き方がされていました。配列をリテラルで書いてmutableCopyしています。若干手抜きに見えなくもないですが、なるほどといった感じです。

こちらの方が見た目的に簡潔ですね。もちろん連想配列も次のように書けます。


NSDictionary *d = [@{} mutableCopy];

 

巷ではよく知られた書き方なんですかね? 自分ははじめて見たので目から鱗な感じでした。