11

在 Objective-C 中是否有比较两个对象的标准机制?

我知道isEqual方法,但我不是在寻找完全相等的比较,而是小于/大于/相等的比较。

在Java中我们可以compareTo:做到这一点,在Objective-C中是否有类似的东西?

4

3 回答 3

25

在 Objective-C 中没有标准的协议进行比较,就像Comparable<T>Java 中的接口一样,但是 Foundation 框架中的一些类定义了一个compare:方法。

NSString并且NSNumber是一些例子。

如果您想为自定义类提供自己的比较方法,我建议您遵守约定并提供具有以下签名的方法

- (NSComparisonResult)compare:(MyClass *)object;

NSComparisonResult是一个枚举,定义如下

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

NSOrderedAscending意味着左边的操作数小于右边的操作数(从这个你得到其他的)。

笔记

值得强调的是,Objective-C 和密切相关的 Foundation Framework 是建立在约定之上的。它们不仅仅是一种惯用的写作方式,因为有时实现依赖于它们。例如,如果您在NSSortDescriptor没有指定自定义选择器的情况下实例化 a,则默认实现将调用compare:对象。(以 David Ronnqvist 为例)

另一个值得注意的例子是方法的命名约定。以 开头的实例方法init预计会返回一个保留计数为 +1 的对象。这是一个非常强大的约定,随着 ARC 的出现,它已经被形式化并内置到编译器中。

总结一下:约定总是很重要的。在 Objective-C 中,它们有时是基本的。

于 2013-08-22T13:05:18.250 回答
6

你应该实施

- (NSComparisonResult)compare:(CustomClass *)otherObject;

并返回NSOrderedAscending,NSOrderedDescendingNSOrderedSame.

即使NSObject没有实现它,它也是整个系统用于比较的方法。例如:

NSArray *unsorted = @[[CustomClass new], [CustomClass new], [CustomClass new]];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"self" 
                                                       ascending:NO]
NSArray *sorted = [unsorted sortedArrayUsingDescriptors:@[sort]];

将调用compare:“CustomClass”并使用结果对数组进行排序。请注意,如果您的类没有实现compare:,它将因此而崩溃(排序时)。

于 2013-08-22T12:55:47.373 回答
3

compare:NSString、NSDate、NSNumber 等类中都有方法。他们都回来了NSComparisonResult

于 2013-08-22T12:56:48.550 回答