我有NSMutableArray
可以包含两个对象:
NSString
和这一个:
@interface FileDownloadItem : NSObject
@property (nonatomic, retain) NSString *title;
.......
@end
我希望能够对NSMutableArray
或者标题或字符串进行排序。
在我在数组中使用NSString之前,我使用此命令:
NSSortDescriptor * sortDescriptor = [[[NSSortDescriptor alloc]initWithKey:@"title" ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
favoritesArray = [[NSMutableArray alloc] initWithArray:[[[FavoritesRep sharedFavoritesRep] favoritesArray] sortedArrayUsingDescriptors:sortDescriptors]];
但现在它只是崩溃了。
答案 0 :(得分:2)
这是一个合适的解决方案:
NSArray *sortedArray = [myArrayToSort sortedArrayUsingComparator:^(id obj1, id obj2) {
if (! [obj1 isKindOfClass:[NSString class]])
obj1 = [obj1 title];
if (! [obj2 isKindOfClass:[NSString class]])
obj2 = [obj2 title];
return [obj1 caseInsensitiveCompare:obj2];
}
答案 1 :(得分:0)
这是一个黑客:
@interface NSString (title)
- (NSString *)title;
@end
@implementation NSString (title)
- (NSString *)title { return self; }
@end
这样您就可以保留现有代码。但它使NSString的命名空间变得混乱,不建议用于生产代码。
答案 2 :(得分:0)
这是最好的解决方案:
@implementation FileDownloadItem
- (NSString *)description
{
return self.title
}
@end
要使用略微修改的排序描述符对现有代码进行排序:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"description" ascending:YES selector:@selector(caseInsensitiveCompare:)];
答案 3 :(得分:-1)
由于对象不同,iOS不知道要比较什么。您需要提供有关要与字符串进行比较的FileDownloadItem的哪些部分的信息。您可以尝试使用比较器。像这样:
NSArray *sortedArray = [yourArray sortedArrayUsingComparator:^(id obj1, id obj2) {
NSString *title = [obj1 valueForKeyPath:@"@title"];
obj2;
return (NSComparisonResult)[title compare:obj2];
}];