#objective-c #cocoa #sorting #key-value-observing #nssortdescriptor
#objective-c #cocoa #сортировка #наблюдение за ключом-значением #nssortdescriptor
Вопрос:
У меня есть неупорядоченный массив с экземплярами следующего класса:
@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. Пожалуйста, обратите внимание, что
NS(Mutable)Set
это не пакет. Если вам нужна настоящая сумка, то есть коллекция, куда вы можете поместить более одного каждого элемента, используйтеNSCountedSet
, которая всегда изменчива.
Ответ №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
.