[Collections]NSArrayとNSDictionaryのリテラル表記


前回紹介したStanford大学の教材からもう一つネタを。

「Coding Together:Developing Apps for iPhone and iPad(Winter 2013)」の「3.Objective-C(January 15,2013)」の「39分30秒あたり」でさらっと触れているネタです。
Objective-cリテラル表記は比較的新しい書き方なので2010年や2011年の教材にはないはずです。

1.Objective-cリテラル記法

レファレンスを参照しています。

例えば「Legacy」な書き方(実際、私はほとんどこのように書いている)


NSNumber *magicNumber = [[NSNumber alloc] initWithInt:42];
NSNumber *unsignedNumber = [[NSNumber alloc] initWithUnsignedInt:42u];
NSNumber *longNumber = [[NSNumber alloc] initWithLong:42l];
 
NSNumber *boolNumber = [[NSNumber alloc] initWithBOOL:YES];
 
NSNumber *simpleFloat = [NSNumber numberWithFloat:3.14f];
NSNumber *betterDouble = [NSNumber numberWithDouble:3.1415926535];
 
NSNumber *someChar = [NSNumber numberWithChar:'T'];

を「Modern」な書き方


NSNumber *magicNumber = @42;
NSNumber *unsignedNumber = @42u;
NSNumber *longNumber = @42l;
 
NSNumber *boolNumber = @YES;
 
NSNumber *simpleFloat = @3.14f;
NSNumber *betterDouble = @3.1415926535;
 
NSNumber *someChar = @'T';

のように書けるようになって、ちょっと簡単になったようです。

不思議なもので、Legacyな書き方に慣れてしまうと、そのように書いてないと逆に分かり難いように感じてしまうものですが、まぁ慣れでしょう。

2.Collectionのリテラル記法

NSArrayは、オブジェクトを“順序を維持して保持する”コレクションです。
NSDictionaryは、オブジェクトを“キーバリューペアで保持する”コレクションです。

これら以外にNSSetやNSHashTableもあるのですが、今回は除外します。

NSArrayは


id firstObject = @"someString";
id secondObject = nil;
id thirdObject = @"anotherString";
NSArray *someArray =[NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];


・・・
NSArray *someArray = @[firstObject, secondObject, thirdObject];

と書けるようになりました。

リストの末尾を意味する「nil」が不要になりました。こういうちょっとしたことが便利になるのですが、逆に昔のコードを手直しする時のバグの温床になるような気がします(ネガティブすぎるけど)。

NSDictionaryは


NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
        someObject, @"anObject",
        @"Hello, World!", @"helloString",
        @42, @"magicNumber",
        someValue, @"aValue",
nil];


NSDictionary *dictionary = @{
        @"anObject" : someObject,
        @"helloString" : @"Hello, World!",
        @"magicNumber" : @42,
        @"aValue" : someValue
};

のように書けるようになりました。

これは、結構大きな改善で、「Key-Valueの対応」がはっきりと分かるようになっています。
Legacy記法では“奇数番目がValue”で、“偶数番目がKey”ですので、カンマの数を数えて目がチカチカしてくるわけです。
こちらも末尾のnilが不要になっていますね。

なお、NSArrayもNSDictionaryも「nil」は要素として保持できません。
もしどうしても必要ならNSNullを使います。


NSArray *array = @[ @"string", @42, [NSNull null] ];

今回は以上です。
ビデオ教材の内容に戻りますが、「オブジェクトの配列を引数にする際に@[object]とすればOK」というあまりにもアッサリとした説明に、もう少し説明して欲しいと思ったのが、今回の記事の動機です。

The following two tabs change content below.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>