在 Objective-C 中是否有比较两个对象的标准机制?
我知道isEqual
方法,但我不是在寻找完全相等的比较,而是小于/大于/相等的比较。
在Java中我们可以compareTo:
做到这一点,在Objective-C中是否有类似的东西?
在 Objective-C 中是否有比较两个对象的标准机制?
我知道isEqual
方法,但我不是在寻找完全相等的比较,而是小于/大于/相等的比较。
在Java中我们可以compareTo:
做到这一点,在Objective-C中是否有类似的东西?
在 Objective-C 中没有标准的协议进行比较,就像Comparable<T>
Java 中的接口一样,但是 Foundation 框架中的一些类定义了一个compare:
方法。
如果您想为自定义类提供自己的比较方法,我建议您遵守约定并提供具有以下签名的方法
- (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 中,它们有时是基本的。
你应该实施
- (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]];
将调用compare:
“CustomClass”并使用结果对数组进行排序。请注意,如果您的类没有实现compare:
,它将因此而崩溃(排序时)。
compare:
NSString、NSDate、NSNumber 等类中都有方法。他们都回来了NSComparisonResult
。