2010/08/25

[Objective-C]配列に数値を扱う

このエントリーをはてなブックマークに追加
Objective-C入門したてです。iOS4 SDKなんぞをいじっています。

要素数が不変の配列を生成して、その要素を逐次更新していくようなコードを書きたかったわけですが、3時間ほど手探り状態のままはまってしまいました。

C#で書くと下記3行のようなこと。

int[] list; // ①宣言
list = {1,2,3,4,5}; // ②初期化
list[2] += 1; // ③更新

Objective-Cで配列を扱うには、int[]かNSArrayかNSMutableArrayを使用する。

int[]は宣言時に要素数が固定できる場合にしか使用できない。

NSArrayは固定化された配列を扱う場合、NSMutableArrayは動的に要素数を増やしたり減らしたりできる配列。NSMutableArrayで配列を構成しておいてNSArrayに格納し直す方法を使うと、初期化の時点で要素数を固定できれば、宣言時には指定しなくてもいい。

ただしNSArrayもNSMutableArrayも、格納できるのはオブジェクトだけなので、数値を扱う場合にはそのままでは格納できません。NSNumberクラスを利用してラッピングしてあげる必要があるようです。やれやれ、この時点でもう面倒くさいです。

●NSArrayを使用する(要素の更新が不要な場合)


// ①宣言
NSArray *list; 

// ②初期化
NSMutableArray *mlist = [[NSMutableArray alloc] init];
for(int i=0;i<4;i++){
NSNumber *num = [NSNumber numberWithInteger:i];
[mlist addObject:num];
}
list = [[NSArray alloc] initWithArray:mlist];
[mlist release];

// ④解放
[list release];

●NSMutableArrayを使用する

更新が必要な場合は最初からNSMutableArrayを使用する。(NSArrayを使用して、NSNumberの値だけを変更する方法が解らなかったので)
// ①宣言
NSMutableArray *list; 

// ②初期化
list = [[NSMutableArray alloc] init];
for(int i=0;i<4;i++){
NSNumber *num = [NSNumber numberWithInteger:i];
[list addObject:num];
}

// ③更新
NSNumber *num = [list objectAtIndex:2]; // 2番目の要素を引っ張りだす
NSInteger i = [num intValue] + 1; 
[list replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:i]]; // 2番目に要素を入れ直す

// ④解放
[list release];

うわー、長いなー。こんなもんちょっとしたがっつりコードじゃないか。



ひょっとすると、何か根本的に間違っているのかもしれません。プリミティブな数値配列を更新するなんて頻繁に行うもんじゃないというコード的な思想があって、決してObjective-Cが面倒なのではないとか。そもそもWindowsプログラミングで育ってきた人とは異質な感覚があって、もっと徹底的にオブジェクトクラスを中心に設計していく分にはこんな冗長的なコードにはならないのかも。単純な数値配列とのコードの比較がそもそも不毛であるという意味で。あるいは、NSNumberクラスはもっと汎用的で使い勝手がいいクラスなのかも。

まあ、そう思わないことにはやってられないというのもあります。がんばります。

2 件のコメント :