如何首先使用具有特定名称的NSSortdescriptor,然后按名称排序?

bog*_*gen 1 sorting objective-c nssortdescriptor ios

是否可以使用NSSortDescriptor首先对给定值进行排序,然后在对象名称后面进行排序?

NSArray *values = @[@"Fish",@"Me", @"Aardvark ", @"Turtle"]
Run Code Online (Sandbox Code Playgroud)

通缉结果:

NSArray *sortedvalues = @[@"Me", @"Aardvark",@"Fish", @"Turtle"]
Run Code Online (Sandbox Code Playgroud)

dan*_*anh 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];
Run Code Online (Sandbox Code Playgroud)

我想你可以添加一个空键路径并使用排序描述符(感谢@Prince),但这似乎是一个额外的步骤......

// define the comparator as above
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"" ascending:YES comparator:comparator];
NSArray *sorted = [values sortedArrayUsingDescriptors:@[sd]];
Run Code Online (Sandbox Code Playgroud)

编辑

假设数组的元素实际上是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]];
Run Code Online (Sandbox Code Playgroud)

您需要将@"prop"更改为要对托管对象进行排序的密钥路径.