iOS sortedArrayUsingFunction函数签名混淆

时间:2011-10-18 00:42:38

标签: objective-c ios

我已阅读Sort NSArray using sortedArrayUsingFunction,以下问题可能会揭示我对Objective-C的无知。

上述问题的答案表明我需要一种签名具有形式的方法 - (NSInteger) sortFunction(id id1, id id2, void *context);

但是我所拥有的所有代码都有

形式的函数签名
- (NSInteger) sortFunction:(id) id1, foo:(id) id2, bar:(void *) context;

当我将sortFunction的声明更改为第一种形式时,我会遇到各种错误:“预期的”;“在myclass.h和myclass.m中的'('token'之前,以及其他几个文件中;相同的''sortFunction'未声明“消息,我得到了另一种方式;并且”期望'{'在'''之前令牌“在myclass.m中的sortFunction声明。

当我在第二种形式中使用它时,我在调用sortedArrayUsingFunction时出错 - 即“function”sortFunction“未声明”。

我错过了什么?

3 个答案:

答案 0 :(得分:3)

此方法需要实际功能,而不是方法。如果要使用方法,可以使用sortedArrayUsingSelector:,并且期望在对象本身上定义此方法。因此,如果你有一个NSString的数组,你可以在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];

答案 1 :(得分: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

答案 2 :(得分: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];