Objective-C 配列

目次

配列の作成

配列を作成するにはNSArray、NSMutableArrayクラスがある。
NSArrayは要素数が決まっている場合に使い、NSMutableArrayは要素が決まっておらず追加、削除、値を変更する配列の作成に使用する。
配列に格納できる要素はオブジェクトだけなので数値の場合も@をつける必要がある

NSArray *arr = @[@"item1", @"item2", @"item3"];
// 数値
NSArray *narr = @[@10, @15, @3.1];

NSMutableArray 要素の追加・削除

NSMutableArrayクラスの空の配列はarrayメソッドで作成する。
要素の追加はaddObject,addObjectsFromArrayメソッドを使用して追加する。
要素の削除はremoveObjectAtIndex、removeObject等を使用する。
removeObjectAtIndexは添字を指定して削除する。
removeObjectはオブジェクトを指定して削除する。

// 配列の作成
NSMutableArray *arr = [NSMutableArray array];

// 配列に追加
[arr addObject:@"item1"];
[arr addObjectsFromArray:@[@"item2", @"item3"]];

// 配列の削除
[arr removeObjectAtIndex: 1];
[arr removeObject: @"item1"];
phpだと配列の作成、追加、削除等も簡単だったのにクラスになったとたんなんかややこしく感じるぞ。。。
確かjavaも配列はクラスを使用して作成していたな。

配列のネスト

多次元配列よく使いますよね。Objective-Cでも可能なようです。配列に配列のオブジェクトを追加する感じです。

// 配列作成
NSMutableArray *arr = [NSMutableArray array];
NSMutableArray *arr2 = [NSMutableArray array];

// 配列の中に配列のオブジェクトをセット
[arr addObject: @[@"item1", @"item2"]];
[arr addObject: arr2];

// arr2に値をセット
[arr2 addObject: @"item3"];
[arr2 addObject: @"item4"];

上の例だとarrの中身はarr[0][0]:item1、arr[0][1]:item2、arr[1][0]:item3、arr[1][1]:item4が格納されています。

配列の検索

indexOfObjectメソッドを使用して検索ができる。見つからなかった場合はNSNotFound(リファレンスをみたところNSIntegerMax)が返ってくる。

// 配列の作成
NSMutableArray *arr = [NSMutableArray array];

// 配列に追加
[arr addObjectsFromArray:@[@"item1", @"item2", @"item3"]];

// 配列の検索
// 2が返ってくる
int idx = [arr indexOfObject: @"item3"];

// NSNotFoundが返ってくる
idx = [arr indexOfObject: @"item4"];

配列に含まれているかどうかチェックする場合にはcontainsObjectメソッドを使用する。
含まれている場合はtrue、含まれていない場合はfalseが返ってくる。

// 配列の作成
NSMutableArray *arr = [NSMutableArray array];

// 配列に追加
[arr addObjectsFromArray:@[@"item1", @"item2", @"item3"]];

// 配列の検索
// trueが返ってくる
BOOL isFound = [arr containsObject: @"item3"];

// falseが返ってくる
isFound = [arr containsObject: @"item4"];

配列の並び替え

昇順、降順に並び替えをするならsortedArrayUsingDescriptorsメソッドを使用する。引数には配列、中のオブジェクトはNSSortDescriptorを渡します。
NSSortDescriptorを作成する際に引数のascendingにtrueを渡すと昇順、falseを渡すと降順で並び替えてくれます。

NSMutableArray *arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@"item1", @"item2", @"item3"]];

// 並び替え
NSArray *arr2 = [arr sortedArrayUsingDescriptors: @[[NSSortDescriptor sortDescriptorWithKey: @"" ascending:false]]];
// arr2はitem3,item2,item1の並びになっている。

抽出

filterUsingPredicateメソッドで条件に合致した要素だけを抽出した配列になる。引数はNSPredicateクラスのオブジェクトでNSPredicateクラスのオブジェクトはpredicateWithFormatメソッドで作成できる。predicateWithFormatメソッドの引数はNSStringでここに条件書式を記述する。
○で始まる値を抽出する場合は「@”self beginswith ‘○'”」という書式。
○が含まれている値を抽出する場合は「@”self contains ‘○'”」という書式。
文字数で抽出する場合は「@”length > 5″」(5文字以上)や「@”length <= 3"」(3文字以下)という書式。 数値オブジェクトの場合は大きさで抽出もできる。「@"self >= 10″」(10以上の要素)や「@”self == 5″」(5だけ)という書式

NSMutableArray *arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@"tokyo", @"osaka", @"fukuoka", @"okinawa"]];

// 抽出
// oで始まる要素を抽出
NSPredicate *prd = [NSPredicate predicateWithFormat:@"self beginswith 'o'"];
[arr filteredArrayUsingPredicate: prd];
// 結果:osaka,okinawa

// aが含まれる要素を抽出
arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@"tokyo", @"osaka", @"fukuoka", @"okinawa"]];
prd = [NSPredicate predicateWithFormat:@"self contains 'a'"];
[arr filteredArrayUsingPredicate: prd];
// 結果:osaka,fukuoka,okinawa

// 文字列が5文字より大きい要素を抽出
arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@"tokyo", @"osaka", @"fukuoka", @"okinawa"]];
prd = [NSPredicate predicateWithFormat:@"length > 5"];
[arr filteredArrayUsingPredicate: prd];
// 結果:fukuoka,okinawa

// 10より小さい要素を抽出
arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@10, @8, @12, @18, @9]];
prd = [NSPredicate predicateWithFormat:@"self < 10"];
[arr filteredArrayUsingPredicate: prd];
// 結果:8,9

試してみたところできない。。。リファレンスをみたところ配列を変更するのではなく抽出した結果を配列で返すそうです。なので下にしたところ正しく結果が返ってきました。

NSMutableArray *arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@"tokyo", @"osaka", @"fukuoka", @"okinawa"]];

// 抽出
// oで始まる要素を抽出
NSPredicate *prd = [NSPredicate predicateWithFormat:@"self beginswith 'o'"];
NSArray * arr2 = [arr filteredArrayUsingPredicate: prd];
// 結果:osaka,okinawa

// aが含まれる要素を抽出
prd = [NSPredicate predicateWithFormat:@"self contains 'a'"];
arr2 = [arr filteredArrayUsingPredicate: prd];
// 結果:osaka,fukuoka,okinawa

// 文字列が5文字より大きい要素を抽出
prd = [NSPredicate predicateWithFormat:@"length > 5"];
arr2 = [arr filteredArrayUsingPredicate: prd];
// 結果:fukuoka,okinawa

// 10より小さい要素を抽出
arr = [NSMutableArray array];
[arr addObjectsFromArray:@[@10, @8, @12, @18, @9]];
prd = [NSPredicate predicateWithFormat:@"self < 10"];
arr2 = [arr filteredArrayUsingPredicate: prd];
// 結果:8,9

Follow me!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください