2011-10-18 34 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的聲明是第一種形式,我得到的各種錯誤:A「預期‘;’在myclass.h和myclass.m以及其他幾個文件中的'('token'之前;'sortFunction'未聲明'的消息,我以另一種方式;'expected'{'before'('令牌」關於sortFunction的myclass.m聲明

當我在第二形式使用它,我得到我的電話sortedArrayUsingFunction的錯誤 - 即‘功能‘sortFunction’未聲明’

我錯過了什麼?

+0

你說「各種各樣的錯誤」 - 你能詳細說明一下嗎? – bryanmac

+0

澄清for bryanmac –

回答

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

啊哈!這很有道理。我會立即嘗試。 –

1

此代碼示例採用一個函數。

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

這裏的功能代碼:

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偉大的名字 – NWCoder

+0

我總是保持一個Craplet CMD線項目打開@家&工作嘗試代碼:) – bryanmac

0

第一種格式,如果你不想要一個功能,您還可以使用此重載使用塊是正確的,請張貼您要詳細說明的錯誤。同時這裏是一個例子。

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];