我有一个带有以下类实例的无序数组:
@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的arg是一个关键路径。
但是,如果我尝试使用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:]:这个类是 不符合关键值编码 重点城市。'
我可以使用密钥路径吗?我做错了什么?
答案 0 :(得分:30)
您可能想要使用它:
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
的排序描述符。