14

我有以下可变数组:

NSMutableArray *persons = [[NSMutableArray alloc]initWithObjects:person1, person2, person3, nil];

其中每个人都是一个对象,其中包含 (NSInteger) personAge 和 (NSString*) personName 属性。现在我想按 personAge 对这个数组进行排序。所以我尝试了以下方法:

[persons sortUsingComparator:
     ^NSComparisonResult(id obj1, id obj2)
     {
         Person *p1 = (Person*)obj1;
         Person *p2 = (Person*)obj2;

        return [p1.personAge compare: p2.personAge];

     }];

    NSLog(@"%ld", [persons componentsJoinedByString:@" "]);

但是我在返回行中收到“错误的接收器类型'NSInteger'(又名'long')”错误消息。此外,我在 NSLog 行中有一条警告:“格式指定类型为 'long',但参数的类型为 'NSString *'”。我如何解决它?

4

5 回答 5

38

你不应该改用这样的东西吗?

[persons sortUsingComparator:
      ^NSComparisonResult(id obj1, id obj2){

             Person *p1 = (Person*)obj1;
             Person *p2 = (Person*)obj2;
             if (p1.personAge > p2.personAge) {
                return (NSComparisonResult)NSOrderedDescending;
            }

            if (p1.personAge < p2.personAge) {
                return (NSComparisonResult)NSOrderedAscending;
            }
            return (NSComparisonResult)NSOrderedSame;
    }
];

问题是你依赖于compare不存在的方法NSInteger:它只是一个 typedef int。所以你想比较整数值并返回一个NSComparisonResult值来相应地表示你的对象的顺序。

于 2012-09-11T13:01:37.813 回答
4

您正在尝试调用不是对象的compare:NSInteger它是整数类型的 typedef(int或者long取决于架构)。

此外,componentsJoinedByString:返回一个NSString,而不是一个整数。

尝试:

[persons sortUsingComparator:
    ^NSComparisonResult(id obj1, id obj2)
    {
        Person *p1 = (Person*)obj1;
        Person *p2 = (Person*)obj2;

        if (p1.personAge < p2.personAge)
            return NSOrderedAscending;
        if (p1.personAge > p2.personAge)
            return NSOrderedDescending;
        return NSOrderedSame;
 }];

NSLog(@"%@", [persons componentsJoinedByString:@" "]);
于 2012-09-11T13:02:34.230 回答
1

关于“错误的接收器类型...”错误,NSInteger是原始数据类型(不是 Objective-C 类),因此您不能在其上调用方法。您想要做的是以下内容:

if (p1.personAge > p2.personAge) {
    return (NSComparisonResult)NSOrderedDescending;
}

if (p1.personAge < p2.personAge) {
    return (NSComparisonResult)NSOrderedAscending;
}
return (NSComparisonResult)NSOrderedSame;

警告是由于@"%ld"格式字符串很长(如警告所述),但-componentsSeparatedByString:返回一个NSString对象。任何 Objective-C 对象的正确格式字符串是@"%@",所以该行应该是NSLog(@"%@", [persons componentsJoinedByString:@" "]);.

于 2012-09-11T13:04:18.027 回答
0
[YOURMutableArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
于 2013-02-20T09:59:56.353 回答
0

像 tigeguero 的回答,但更整洁:

 [people sortUsingComparator:
      ^NSComparisonResult(Person* p1, Person* p2){

            if (p1.personAge > p2.personAge) {
                return NSOrderedDescending;
            }
            else if (p1.personAge < p2.personAge) {
                return NSOrderedAscending;
            }
            else{
                return NSOrderedSame;
            } 
    }
 ];
于 2014-02-02T01:21:41.293 回答