我已阅读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“未声明”。
我错过了什么?
答案 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];