配列とループ処理を理解しようCocoaの素、Objective-Cを知ろう(5)(2/4 ページ)

» 2009年01月21日 00時00分 公開
[竹下肯己株式会社 qnote]

NSArrayクラス

 Objective-Cの最も基本的な配列クラスは「NSArray」です。このクラスは、一度生成すると中身を変更することはできません。以下に、NSArrayの利用例を示します。

#import <Foundation/Foundation.h>
int main(void) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  //(1)配列の生成
  NSArray *array =
    [NSArray arrayWithObjects:@"abc", @"def", @"ghi", @"jkl", nil];
  //(2)配列の要素数を取得
  int arrCount = [array count];
  //(3)配列の要素を取り出す
  id obj01 = [array objectAtIndex:2];
  id obj02 = [array lastObject];
  NSArray *array2 = [array subarrayWithRange:NSMakeRange(1, 3)];
  //(4)ある要素のインデックスを取得
  int objectIndex = [array indexOfObject:@"pqr"];
  if (objectIndex == NSNotFound) {
    NSLog(@"'pqr' is not found.\n");
  }
  //(5)ある要素が含まれているか確認
  BOOL isObjectContain = [array containsObject:@"xyz"];
  //(6)配列の比較
  NSArray *array3 =
    [NSArray arrayWithObjects:@"abc", @"def", @"ghi", @"jkl", nil];
  BOOL isArrayEquals = [array isEqualToArray:array3];
  // 結果の出力
  NSLog(@"array : %@\n", array);
  NSLog(@"arrCount : %d\n", arrCount);
  NSLog(@"obj01 : %@\n", obj01);
  NSLog(@"obj02 : %@\n", obj02);
  NSLog(@"array2 : %@\n", array2);
  NSLog(@"objectIndex : %d\n", objectIndex);
  NSLog(@"isObjectContain : %d\n", isObjectContain);
  NSLog(@"isArrayEquals : %d\n", isArrayEquals);
  [pool drain];
  return 0;
}
main.m

※「NSLog」は、文字通りログを出力する関数で、デバッグなどに利用します。使い方はprintf関数とほぼ同じですが、NSLogの場合はオブジェクトの内容を出力できるので便利です。オブジェクトをデバッグする場合、第1引数の文字列内の指定では「%@」を指定します。また、第1引数自体もObjective-Cの文字列(NSString)で指定します。

 (1)の「arrayWithObjects:」は、NSArrayの最もシンプルな生成方法です。配列に保持させたいオブジェクト群を引数として渡して配列を生成します。これは前回のNSStringのところでも解説した、インスタンスの生成から初期化までを行ってくれるメソッドです。別途、イニシャライザとして「initWithObjects:」も用意されています(引数は「arrayWithObjects:」と同じです)。

 なお、NSArrayや、後述の「NSDictionary」を利用する場合、注意しておくべきことがあります。それは、オブジェクトの並びの最後に必ずnilをセットすることです。これにより、要素の終端位置を示すことになります。

 (2)の「count」は配列の要素数を取得するメソッドです。

 (3)は、配列から要素を取り出す方法の一部です。「objectAtIndex:」は、文字通りインデックスを指定して配列の要素を取り出します。インデックスは、C言語の通常の配列と同じく0から始まります。「lastObject」は配列の最後の要素(nilの1つ手前)を取り出します。

 「subarrayWithRange:」は、NSRange構造体で範囲(開始インデックスと要素数)を指定して配列の要素を抽出し、それらを新たな配列として返すメソッドです。

 (4)の「indexOfObject:」は、引数で指定したオブジェクトが配列内に存在する場合に、そのインデックスを返します。オブジェクトが存在しなかった場合、「NSNotFound」という値(定数)が返されます。

 (5)の「containsObject:」は、引数で指定したオブジェクトが配列内に存在するかどうかを判定します。

 (6)の「isEqualToArray:」は、2つの配列の要素が同じかどうかを判定します。

 なお、上記の(4)(5)(6)のように配列内を検索してオブジェクトの突き合わせを行うようなメソッドでは、それぞれのオブジェクトの「isEqual」メソッドで比較が行われます。従って、そのクラスのisEqualメソッドの実装によって判断は異なります。デフォルトのisEqualメソッド(NSObjectのisEqualメソッド)では、インスタンス(実体)が等しい場合にYESを返します。

変更可能な配列

 内容が固定となる「NSArray」に対し、自由に要素を追加・置換・削除できるのが「NSMutableArray」クラスです。以下に利用例を見てみましょう。

#import <Foundation/Foundation.h>
int main(void) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  //(1)空の可変配列を生成
  NSMutableArray *mArray = [NSMutableArray array];
  //(2)固定の配列をコピーして、可変の配列を生成
  NSArray *fArray =
    [NSArray arrayWithObjects:@"fff", @"ggg", @"hhh", @"iii", nil];
  NSMutableArray *mArray2 = [fArray mutableCopy];
  //(3)要素の追加・挿入や置換
  [mArray addObject:@"ABC"];
  [mArray insertObject:@"OPQ" atIndex:1];
  [mArray replaceObjectAtIndex:1 withObject:@"XYZ"];
  [mArray replaceObjectsInRange:NSMakeRange(0, 1)
    withObjectsFromArray:[NSArray arrayWithObjects:
      @"aaa", @"bbb", @"ccc", @"ddd", @"eee", nil]];
  [mArray addObjectsFromArray:fArray];
  //(4)要素の削除
  [mArray removeObjectAtIndex:3];
  [mArray removeObject:@"ggg"];
  [mArray removeObjectsInArray:
    [NSArray arrayWithObjects:@"bbb", @"iii", nil]];
  [mArray removeObjectsInRange:NSMakeRange(2, 3)];
  [mArray removeLastObject];
  NSLog(@"%@", mArray);
  NSLog(@"%@", mArray2);
  [pool drain];
  return 0;
}
main.m

 (1)では、空っぽの状態でNSMutableArrayの配列を生成しています。(2)の「mutableCopy」は、NSArrayの配列をコピーして、可変のNSMutableArrayを生成する方法です。

 NSMutableArrayはNSArrayのサブクラスなので、配列の生成、要素数の取得、要素の取り出し、要素の存在確認や位置(インデックス)の取得など、基本的な処理はすべてNSArrayのメソッドをそのまま利用できます(1つ前のNSArrayのコード例を参照してください)。

 NSMutableArrayクラスで独自に実装されているのは、主に配列の中身を操作するためのメソッド群です。(3)は要素の追加・挿入や置換を行うメソッド群、(4)は要素の削除を行うメソッド群です。これらは、その配列のインスタンスそのものを直接変更します。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。