是否可以先使用NSSortDescriptor对给定值进行排序,然后在对象名称之后进行排序?
NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"]
通缉结果:
NSArray *sortedvalues = @[@"Me", @"Aardvark",@"Fish", @"Turtle"]
答案 0 :(得分:5)
排序描述符用于包含的对象符合KVO(响应valueForKey :)。使用比较器的方法是......
NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"];
NSComparisonResult (^comparator)(id,id) = ^(id left, id right) {
if ([left isEqualToString:@"Me"]) return NSOrderedAscending;
if ([right isEqualToString:@"Me"]) return NSOrderedDescending;
return [left compare:right];
};
NSArray *sortedValues = [values sortedArrayUsingComparator:comparator];
我猜你可以添加一个空键路径并使用排序描述符(感谢@Prince),但这似乎是一个额外的步骤...
// define the comparator as above
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES comparator:comparator];
NSArray *sorted = [values sortedArrayUsingDescriptors:@[sd]];
修改强>
假设数组的元素实际上是KVO对象。然后排序描述符更自然。只需将上面给出的想法应用于字符串的关键路径,例如
NSDictionary *kvo0 = @{ @"prop": @"Fish"};
NSDictionary *kvo1 = @{ @"prop": @"Me"};
NSDictionary *kvo2 = @{ @"prop": @"Ardvark"};
NSDictionary *kvo3 = @{ @"prop": @"Turtle"};
NSArray *values = @[kvo0, kvo1, kvo2, kvo3];
NSComparisonResult (^comparator)(id,id) = ^(id left, id right) {
if ([left isEqualToString:@"Me"]) return NSOrderedAscending;
if ([right isEqualToString:@"Me"]) return NSOrderedDescending;
return [left compare:right];
};
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"prop" ascending:YES comparator:comparator];
NSArray *sorted = [values sortedArrayUsingDescriptors:@[sd]];
您需要将@“prop”更改为您要对托管对象进行排序的密钥路径。
答案 1 :(得分:0)
您可以使用这样的比较器创建排序描述符...
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES comparator:^(NSString *string1, NSString *string2) {
if ([string1 isEqualToString:@"Me"]){
return NSOrderedAscending;
}
// edited thanks to @danh
if ([string2 isEqualToString:@"Me"]){
return NSOrderedDescending;
}
return [string1 compare:string2];
}
然后使用它来对数组进行排序。
如果不需要排序描述符,那么只需使用比较器对数组进行排序。