Сортировка с sortedArrayUsingDescriptors и Key Paths

У меня есть неупорядоченный массив с экземплярами следующего класса:

@interface Place : NSObject {

}

@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, retain) NSURL   *imageURL;


-(id) initWithCountry: (NSString *) aCountry city: (NSString *) aCity imageUrl: (NSURL *) aUrl;


@end

и я пытаюсь сортировать его с помощью sortedArrayUsingDescriptors по странам и городам. Документы для NSSortDescriptor говорят, что аргумент initWithKey: это ключевой путь.

Однако, если я пытаюсь использовать NSortDescriptor, например:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];

Я получаю сообщение об ошибке:

NSMutableSet *bag = [[[NSMutableSet alloc] init] autorelease];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Springfield" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"Afghanistan" 
                                         city:@"Tora Bora" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];
[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.agbo.biz"]]];

[bag addObject:[[Place alloc] initWithCountry:@"USA" 
                                         city:@"Chicago" 
                                     imageUrl:[NSURL URLWithString:@"http://www.google.com"]]];


NSSortDescriptor *sort = [[[NSSortDescriptor alloc] initWithKey:@"country.city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: sort, nil]];

* Завершение приложения из-за неотображенного исключения "NSUnknownKeyException", Причина: '[< NSCFString 0x6ae8 > valueForUndefinedKey:]: этот класс а не для кодирования ключевых значений для ключевой город. '

Можно ли использовать ключевой путь или нет? Что я делаю неправильно?

Ответ 1

Вы можете использовать это:

NSSortDescriptor *country = [[[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES]autorelease];
NSSortDescriptor *city = [[[NSSortDescriptor alloc] initWithKey:@"city" ascending:YES]autorelease];
NSArray *sorted = [bag sortedArrayUsingDescriptors:[NSArray arrayWithObjects: country, city, nil]];

Массив, переданный в sortedArrayUsingDescriptors:, определяет приоритеты сортировки. Дескрипторы сортировки предоставляют ключевые пути для сравнения (и желаемый порядок: восходящий/нисходящий).

Дескриптор сортировки "country.city" будет запрашивать каждое место для своей страны, а затем как возвращенную страну (которая является NSString) для своего города. И все мы знаем, что NSString не соответствует требованиям кодирования для ключевого города;)

Вам понадобится дескриптор сортировки "country.city", если ваши экземпляры Place имели свойство country, которые сами имели свойство city.