NSArray 内のオブジェクトの指定したメンバ変数でソートする方法です。

NSArray に複数の Book クラスが入っているとします。Book クラスは以下のようなメンバ変数を持っています。

@interface Book: NSObject {
  NSInteger no;
  NSString* furigana;
  NSDate* publish_date;
}

ソートするには NSArray 内のオブジェクトに NSComparisonResult を返すメソッドを作り、そのメソッド内で比較をします。

数値でのソート

数値での比較は単純に比較をしてその結果により NSComparisonResult を返します。下記の例は降順にソートしています。昇順にソートしたいときは NSOrderedAscending と NSOrderedDescending を逆にすれば OK です。

- (NSComparisonResult) compareNo:(Book*)_book {
  if (self.no > book.no) {
    return NSOrderedAscending;
  } else if (self.no < _book.no) {
    return NSOrderedDescending;
  } else {
    return NSOrderedSame;
  }
}

ソートするときには以下のようにします。

books = [books sortedArrayUsingSelector:@selector(compareNo:)];

文字でのソート

文字でのソートは NSString クラスの localizedCaseInsensitiveCompare: を使用します。localizedCompare: でもかまいませんが、localizedCaseInsensitiveCompare: の方は大文字、小文字を区別せずに辞書的なソートをしてくれます。

- (NSComparisonResult) compareFurigana:(Book*)_book {
  return [self.furigana localizedCaseInsensitiveCompare:_book.furigana];
}

日付でのソート

日付でのソートは NSDate の compare: を使用します。昇順、降順は self.publish_date と _book.publish_date を入れ替えれば変えられます。

- (NSComparisonResult) comparePublishDate:(Book*)_book {
  return [self.publish_date compare:_book.publish_date];
}

追記 [ 9/13 ]
@erguolinge さんに twitter で sortedArrayUsingDescriptors: を使えばもっと簡単にソートできることを教えていただきました。以下の記事をご参考ください。ありがとうございました!
蒼い惑星: NSArrayのソート方法について

関連する投稿