独自クラスを配列での並び替えに対応する : Objective-C プログラミング

PROGRAM


独自クラスを配列での並び替えに対応する

Objective-C では NSArray を用いて配列を取り扱いますが、このクラスには並び替えを行うための機能がいくつか用意されています。

その中で、例えば、独自に定義したクラスのインスタンスを配列に格納してその並び替えを行いたいような場合に使用できるのが、sortedArrayUsingSelector: というメソッドです。

 

これの利用に先立って、配列に格納される独自クラスの方に、並び替えで使用するメソッドを実装しておく必要があります。

ここでは、例えば商品名 (name) と料金 (price) を保持する ItemClass というクラスがあったとします。このクラスを配列に格納したときに、料金順に並び替えを行うための compareByPrice メソッドを定義すると、次のような感じになります。

@implementation SampleClass

 

// 独自クラスに定義する、並び替えに必要な序列情報を返すメソッドです。

- (NSComparisionResult)compareByPrice:(ItemClass*)argAnother

{

NSComparisionResult result;

 

if (self.price < argAnother.price)

{

// 自身 < 比較対象 の場合は昇順とします。

result = NSOrderedAscending;

}

else if (self.price > argAnother.price)

{

// 比較対象 < 自身 の場合は降順とします。

result = NSOrderedDescending;

}

else

{

// それ以外は同値とします。

result = NSOrderedSame;

}

 

return result;

}

このように、自分自身と、引数に渡された値との間の順序関係を判定して、"自分が前、自分が後、自分と同じ" をそれぞれ "NSOrderedAscending, NSOrderedDescending, NSOrderedSame" という判定結果で通知します。

 

このようなメソッドを用意したら、このクラスのインスタンスが格納されている NSArray 配列 "items" に対して、次のようにすることで、配列の並び替えを行うことが可能になります。

NSArray* sorted_items = [items sortedArrayUsingSelector:@selector(compareByPrice:)];

こうすることで、今回の場合は、compareByPrice: メソッドにより値段順に並べ替えられた配列が、NSArray 型の変数 "sorted_items" に格納されます。

[ もどる ]