iPhone用アプリケーション開発で注目を集める言語「Objective-C」。C++とは異なるC言語の拡張を目指したこの言語の基本を理解しよう(編集部)
第4回「変数のデータ型や文字列の扱いを理解しよう」に引き続いてコーディングの必須要素について解説します。今回のテーマは配列とループ処理です。
プログラムのロジックでは、値の集合や、そこに含まれる各データを扱う処理(検索やループ処理など)が頻繁に登場します。そのため、その仕組みが充実しているかどうかで、言語の使い勝手も大きく変わってきます。
さまざまなプログラミング言語が、それぞれの方法で値の集合を扱う仕組みを提供しています。Objective-Cでは、Foundationに関連クラスが用意されていますので、今回はその使い方を紹介したいと思います。
なお、サンプルプログラムは、前回と同じくmain関数の中にすべて記述し、main.mというファイル名で作成します。コンパイルと実行の方法については、第3回「Objective-Cのクラス定義を理解しよう」の冒頭の部分および第2回「一番初めのObjective-Cプログラム」のコンパイルに関する解説を参照してください。
C言語で複数の変数をまとめて扱う場合、[ ]内にインデックスを指定する、いわゆる配列が使われます。これはプログラミングの世界では非常にポピュラーな方法で、たいていの言語で見掛けることができます。C言語の配列の利用例を見てみましょう。
#import <Foundation/Foundation.h> #import <stdio.h> int main(void) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // 要素数を指定して配列を宣言 int arr1[3]; // インデックスを指定して値をセット arr1[0] = 3; arr1[1] = 5; arr1[2] = 7; // 宣言と同時に値をセット int arr2[] = {2, 4, 6}; // クラスオブジェクトの配列 NSString *arr3[] = {@"abc", @"xyz"}; // 配列の要素数を調べる int arrCnt = sizeof(arr1) / sizeof(arr1[0]); printf("%d\n", arrCnt); // 多次元の配列1(宣言してから値をセット) int arr4[2][2]; arr4[0][1] = 8; arr4[1][1] = 9; // 多次元の配列2(宣言と同時に値をセット) int arr5[2][3] = { {3, 5, 7}, {2, 4, 6} }; // 配列の要素へアクセスする printf("%d\n", arr1[2]); printf("%d\n", arr2[1]); printf("%s\n", [arr3[1] UTF8String]); printf("%d\n", arr4[1][1]); printf("%d\n", arr5[0][2]); [pool drain]; return 0; }
配列の宣言時には、[ ]内に要素数を明示します。配列の要素にアクセスする場合は[ ]内に要素のインデックス(1番目の要素が0になります)を指定してアクセスします。[ ]を重ねて表記することで、多次元の配列(入れ子になった配列)も表現することができます。
先ほどのコード例で見たように、C言語の配列は要素数が固定となっています。これを拡張しようとすると、メモリの領域を新たに確保するなど、少々厄介な操作が必要になります。また、配列についての情報を取得したり、配列の中身を操作したりといった機能もありません。
オブジェクト指向の言語では、多くの場合、単なる配列とは別に値の集合をオブジェクティブに扱うためのクラスが用意されています。Objective-Cでは、Foundationの「NSArray」と「NSMutableArray」、「NSDictionary」と「NSMutableDictionary」などがこれに当たります。単に値を保持するだけでなく、それらの値をいろいろな切り口で取り出したり、検索したり、比較したりといった、関連機能も充実しています。
これらのクラスの共通する特徴は、扱えるデータがオブジェクト型に限定されていることです。intなどの基本的なデータ型の値を集合の要素として保持させたい場合には、前回紹介した「ラッパークラス」を利用してオブジェクト化します。
では、Objective-Cの配列クラスの利用方法を順番に見ていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.