如何根据对象的属性对数组进行排序?

时间:2012-01-09 02:45:47

标签: objective-c ios sorting properties nsarray

我有一个'通用对象'的NSArray,它包含以下属性

-name
-id
-type (question, topic or user)

如何根据通用对象的类型对这个泛型对象数组进行排序?例如。我想在顶部显示“主题”类型的所有通用对象,然后是“用户”而非“问题”

1 个答案:

答案 0 :(得分:5)

您需要定义自定义排序函数,然后将其传递给允许自定义排序的NSArray方法。例如,使用sortedArrayUsingFunction:context:,您可以编写(假设您的类型是NSString实例):

NSInteger customSort(id obj1, id obj2, void *context) {
    NSString * type1 = [obj1 type];
    NSString * type2 = [obj2 type];

    NSArray * order = [NSArray arrayWithObjects:@"topic", @"users", @"questions", nil];

    if([type1 isEqualToString:type2]) {
        return NSOrderedSame; // same type
    } else if([order indexOfObject:type1] < [order indexOfObject:type2]) {
        return NSOrderedDescending; // the first type is preferred
    } else {
        return NSOrderedAscending; // the second type is preferred
    }   
}   

// later...

NSArray * sortedArray = [myGenericArray sortedArrayUsingFunction:customSort
                                                         context:NULL];

如果您的类型不是NSStrings,那么只需根据需要调整函数 - 您可以将order数组中的字符串替换为您的实际对象,或者(如果您的类型是枚举的一部分)直接替换比较并完全消除order数组。