отсортировать NSArray с объектами - PullRequest
1 голос
/ 04 августа 2011

Предположим, что NSArray имеет несколько объектов, принадлежащих двум классам,

@interface FWNewsObj:NSObject
 {
  NSString *newsTitle;
  NSDate *newsTime;
 }
 @end




@interface FWPhotoObj:NSObject
 {
  NSString *photoTitle;
  NSDate *photoTime;
 }
 @end

Я бы хотел отсортировать NSArray по названию объекта (или по времени). Однако переменная заголовка в каждом классе имеет разные имена.

Тогда, как я могу сделать сортировку? Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Что мне сразу приходит в голову (если я правильно понимаю Q):

  • 1-й создайте словарь с ключами titleNames и значениями в качестве объектов
  • Сортируйте массив ключей просто
  • Затем создайте отсортированный массив объектов, извлекая их из словаря, на основе этого массива отсортированных ключей
1 голос
/ 04 августа 2011

Вы должны написать собственный метод сравнения, который реализуют оба ваших класса.Он должен принимать один объект в качестве параметра и возвращать NSComparisonResult (NSOrderedAscending, NSOrderedDescending или NSOrderedSame)

Затем вы можете использовать sortedArrayUsingSelector: с вашим собственным методом сравнения.

Пример:

В FWNewsObj:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [newsTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [newsTitle compare:[(FWNewsObj *)obj newsTitle]];
    }
}

В FWPhotoObj:

- (NSComparisonResult)compareTitle:(id)obj
{
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj);
    if ([obj isKindOfClass:[FWPhotoObj class]]) {
        return [photoTitle compare:[(FWPhotoObj *)obj photoTitle]];
    } else {
        return [photoTitle compare:[(FWNewsObj *)obj newsTitleTitle]];
    }
}

На самом деле было бы проще просто определить метод заголовка в обоих классах, которые переносятсялибо заголовок фото, либо заголовок новости.Тогда вы можете просто использовать NSSortDescriptor с title в качестве ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...