Objective-C compareTo:

时间:2013-08-22 12:52:00

标签: ios objective-c compare

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

我知道isEqual方法,但我不是在寻找确切的平等,而是小于 / / 等于种类比较。

在Java中我们有compareTo:这样做,在Objective-C中有类似的东西吗?

3 个答案:

答案 0 :(得分:24)

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

NSStringNSNumber就是一些例子。

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

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

NSComparisonResult是一个定义如下的枚举

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

NSOrderedAscending表示左操作数小于右操作数(从中获得其他操作数)。

注意

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

另一个值得注意的例子是方法的命名约定。期望以init开头的实例方法返回具有+1保留计数的对象。这是一个如此强烈的惯例,随着ARC的出现has been formalized并且内置于编译器中。

包装起来:约定总是很重要。在Objective-C中,它们有时是基础。

答案 1 :(得分:5)

你应该实施

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

并返回NSOrderedAscendingNSOrderedDescendingNSOrderedSame

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

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

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

答案 2 :(得分:2)

NSString,NSDate,NSNumber和其他类中有compare:方法。他们全都返回NSComparisonResult