我有一个NSArray,我需要根据存储在对象中的变量进行排序(在这种情况下,我的类名是SchedView,它是一个UIViewController)。我在想NSArray会让我传递一个“成员函数”(不确定这是否是Objective-C中使用的术语,我是这种语言的新手)。看来我只能传递一个静态/ C样式函数,所以这就是我最终得到的结果:
- (NSInteger) BuildGridSortCompare :(id) r1 :(id) r2 :(void*) context
{
// Have compare code here, and can use class scope variables...
return NSOrderedSame;
}
NSInteger _BuildGridSortCompare(id r1,id r2,void *context)
{
SchedView *sv = (__bridge SchedView*) context;
return [sv BuildGridSortCompare:r1 :r2 :NULL];
}
- (void)BuildGrid
{
Records = [Records sortedArrayUsingFunction:_BuildGridSortCompare context:(__bridge void *)(self)];
}
BuildGrid和BuildGridSortCompare是我的SchedView类(选择器?)的成员函数。 _BuildGridSortCompare基本上是一个C风格函数,它只是一个调用我的成员函数的包装器。
我以前在C / C ++代码中使用过这个设计,但是在Java和C#这样的现代平台上没有,所以想想Objective-C可能有更好的方法吗?
我不太确定一些类型转换,主要是__bridge。
我正在做什么安全,还是有另一个类似于sortedArrayUsingFunction的函数让我使用成员函数?我确实看到sortedArrayUsingSelector,但似乎调用我正在排序的类上的函数。在这种情况下,我希望函数由self实现。
答案 0 :(得分:1)
我认为您的代码没问题,但您可以使用块更优雅地执行此操作:
records = [records sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
// compare code here, can use self etc.
return ...;
}];
答案 1 :(得分:0)
您的代码看起来不错。我发现使用这两种方法之一在iOS中对数组进行排序更有用:
sortedArrayUsingSelector
:这意味着您将选择器作为参数传递。如果使用此选项,则可以在数组类型上已存在的比较方法上使用选择器。例如,如果你有一个NSNumber数组,你可以传递@selector(compare),这将调用你的NSSNumber对象上的compare方法。如果这不是预定义类型,您可能需要为对象实现自己的比较方法。
sortedArrayUsingComparator
:这意味着你传递一个块作为参数,我觉得它更有光泽。