ツヨシのブログ

技術的な事とか日常の事とか徒然なるままに

リテラルと添字アクセス

iOSのプログラムをObjectiveCで作るときに、インスタンスの生成の書式について気になりそれを調べているとリテラルという言葉を目にしました。それについてなんとなく調べてまとめてみました。

リテラルとは

コンピュータプログラムのソースコドなどで、特定のデータ型による値を直接表記する際の書式。また、そのような書式に従って記載された値。つまり、リテラルを使うことによって、今まで面倒だっオブジェクトの生成が簡単に行えるようになります。

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

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]みたいな感じでアクセスできますが、Objective-Cでは、わざわざ[array objectAtIndex:i]なんて書かなければいけません。このような表記がObjective-C遠ざける要因だったりします。

以前は上記の方法でしたが、いつの間にかObjective-Cのオブジェクトでもこのような書き方ができるようになったようです。

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

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

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

まとめ

というわけで、リテラルと添字アクセスという2つのObjective-C新仕様(!?)を使うことで、よりシンプルにコーディングを行うことができるようになります。 これらを使ってガシガシコーディングしたいと思います。

詳解 Objective-C 2.0 第3版

詳解 Objective-C 2.0 第3版

Effective Objective-C 2.0

Effective Objective-C 2.0