是否存在比较Objective-C中两个对象的标准机制?
我知道isEqual
方法,但我不是在寻找确切的平等,而是小于 / / 等于种类比较。
在Java中我们有compareTo:
这样做,在Objective-C中有类似的东西吗?
答案 0 :(得分:24)
在Objective-C中,没有标准的比较协议,比如Java中的Comparable<T>
接口,但是Foundation框架中的一些类定义了compare:
方法。
如果您想为自定义类提供自己的比较方法,我建议您坚持使用约定并提供具有以下签名的方法
- (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;
并返回NSOrderedAscending
,NSOrderedDescending
或NSOrderedSame
。
即使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
。