2011-10-18 15 views
1

私はSort NSArray using sortedArrayUsingFunctionを読みました。次の質問は、Objective-Cの深い知らせを明らかにすることです。iOS sortedArrayUsingFunction関数のシグネチャの混同

上記の質問に対する回答は、署名の形式が - (NSInteger) sortFunction(id id1, id id2, void *context);のメソッドが必要であることを示しています。

しかし、私が持っているすべてのコードは、フォームの関数のシグネチャを持つ

- (NSInteger) sortFunction:(id) id1, foo:(id) id2, bar:(void *) context; 

私は最初の形式のものであると私sortFunctionの宣言を変更

、私はエラーのすべての種類を取得:「予想 『;』 myclass.hとmyclass.mの両方で 'before'( 'token')と他のいくつかのファイルで同じ "'sortFunction' not declared"というメッセージが返され、 「myclass.mでsortFunctionの宣言に、私は二番目の形式でそれを使用する場合

、私はsortedArrayUsingFunctionの私の呼び出しでエラーが発生します。 - つまり 『トークン機能は『sortFunction』』宣言されていない

+0

あなたは "すべての種類のエラー"と言います - あなたは詳しく説明できますか? – bryanmac

+0

はブライアンマックのために明確化 –

答えて

3

このメソッドは、メソッドではなく実際の関数を必要とします。メソッドを使用する場合は、sortedArrayUsingSelector:を使用し、このメソッドがオブジェクト自体に定義されることが期待されます。の配列を持つたとえば、あなたはNSStringにいくつかの比較セレクタを呼び出します。

// this orders by the object's memory location -- not really very useful in the real world 
NSInteger my_compare_function(id obj1, id obj2, void* context) { 
    if(obj1 < obj2) return NSOrderedAscending; 
    else if(obj1 > obj2) return NSOrderedDescending; 
    else return NSOrderedSame; 
} 

この機能は、あなたがそれを呼び出す場所の範囲のどこかである必要があり、その後、あなたはこのようにそれを呼びたい:

NSArray* sortedArray = [unsortedArray sortedArrayUsingFunction:my_compare_function context:NULL]; 
+0

Ah ha!これは理にかなっています。私はすぐにそれを試みます。 –

1
機能を使用するには、このような何かをしたいです

このコード例では、関数を使用しています。あなたが機能をしたくない場合は、このオーバーロードを使用してブロックを使用することができます。

NSInteger sortNames(id id1, id id2, void *context) 
{ 
    // Sort Function 
    NSString* name1 = (NSString*)id1; 
    NSString* name2 = (NSString*)id2; 

    return ([name1 compare:name2]); 
} 

int main (int argc, const char * argv[]) 
{ 
    NSArray *unsorted = [NSArray arrayWithObjects:@"John", @"Bob", @"Avril", nil]; 
    NSArray *names = [unsorted sortedArrayUsingFunction:sortNames context:nil]; 

    for (NSString* item in names) 
    { 
     NSLog(@"%@", item); 
    } 

    return 0; 
} 

出力::

2011-10-17 20:59:01.790 Craplet[1474:707] Avril 
2011-10-17 20:59:01.792 Craplet[1474:707] Bob 
2011-10-17 20:59:01.792 Craplet[1474:707] John 
+0

++ Craplet great name – NWCoder

+0

私はいつもCraplet cmdプロジェクトを開いて@ homeとコードを試してみることにします:) – bryanmac

0

最初のフォーマット

[unsorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)cmptr 

ここでは、機能コードです正解ですが、あなたが精緻化しているエラーを投稿してください。一方、ここに例があります。

NSInteger personSort(id p1, id p2, void *context) 
{ 
    NSString *name1 = [(MYPersonClass *)p1 firstName]; 
    NSString *name2 = [(MYPersonClass *)p2 firstName]; 
    return [name1 compare:name2] 
} 

NSArray *sortedPerson = [allPeople sortedArrayUsingFunction:personSort context:NULL]; 
関連する問題