July 25, 2012

Objective-Cでオブジェクトリテラルと添字アクセス

OSX v10.8 Mountain Lionがリリースされましたね。Mountain LionではObjective-Cで待望のオブジェクトリテラルと添字アクセスがサポートされました。ここでは簡単な使い方を紹介します。

オブジェクトリテラル

オブジェクトリテラルを使うことによって、今まで面倒だったCocoaオブジェクトの生成が簡単に行えるようになります。

例えば、3つのNSStringインスタンスを持つNSArrayインスタンスを生成するには、今まで以下のように書いていました。

NSArray *array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil];

これが、オブジェクトリテラルを用いると以下のように書けます。

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

このように、@[]で囲むと、その中身を要素として持つNSArrayインスタンスを生成できるようになりました。

また、次のように@{}で囲むとNSDictionaryインスタンスになります(キーと値は:で区切ります)。

NSDictionary *dict = @{@"Key1": @"Value1", @"Key2": @"Value2"};

また、NSNumberインスタンスの生成も簡単に行えます。

NSNumber *n1 = @1;
NSNumber *ny = @YES;

添字アクセス

NSArrayやNSDictionaryの要素へのアクセスって面倒ですよね。C配列ならarray[i]みたいな感じでアクセスできるのに、わざわざ[array objectAtIndex:i]なんて書かなければいけないなんて……。

でも、Objective-Cオブジェクトでもこのような書き方ができるようになりました!

NSArray *array = @[@"A", @"B", @"C"];
array[1]; // => @"B"が返ってくる

NSDictionary *dict = @{@"Key1": @"Value1", @"Key2": @"Value2"};
dict[@"Key1"]; // => @"Value1"が返ってくる

素晴らしいですね。これらの添字アクセスは、添字が数値なら- objectAtIndexedSubscript:が呼ばれ、添字がオブジェクトであれば- objectForKeyedSubscript:が呼ばれます。逆に言えば、これらのメソッドさえ実装してしまえば独自のクラスでも添字アクセスが行えるようになります。

オブジェクトリテラルと添字アクセスという2つのObjective-C新仕様を使えば、きっとコーディングもこれまでより捗ることでしょう。Enjoy Mountain Lion!

© Shun Takebayashi