0

我有一个 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,但这似乎在我正在排序的类上调用了一个函数。在这种情况下,我希望该功能由自己实现。

4

2 回答 2

1

我认为您的代码还可以,但是您可以使用blocks更优雅地做到这一点:

records = [records sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    // compare code here, can use self etc.
    return ...;
}];
于 2012-10-09T17:39:31.600 回答
0

你的代码看起来不错。我发现使用这两种方法中的任何一种在 iOS 中对数组进行排序更有用:

  1. sortedArrayUsingSelector:这意味着您将选择器作为参数传递。如果您使用它,您可以在数组类型上已经存在的比较方法上使用选择器。例如,如果您有一个 NSNumber 数组,您可以传递 @selector(compare) 这将调用您的 NSSNumber 对象上的 compare 方法。如果这不是预定义类型,您可能需要为您的对象实现自己的比较方法。

  2. sortedArrayUsingComparator:这意味着您将一个块作为参数传递,我认为它更闪亮。

于 2012-10-09T17:46:53.253 回答