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です(アーキテクチャに応じて)intlong

また、整数ではなく、を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

「Badreceivertype...」エラーに関して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 に答える