在目标C中,是否有比较两个对象的标准机制?
我知道isEqual方法,但我不是在寻找确切的等式,而是小于/,而不是/等于的比较。
在Java中,我们有这样的compareTo:,在Objective中有类似的东西吗?
发布于 2013-08-22 13:05:18
在Objective中,没有标准的比较协议,比如Java中的Comparable<T>接口,但是基金会框架中的一些类定义了一个compare:方法。
如果您想为自定义类提供自己的比较方法,我建议您坚持使用约定,并提供具有以下签名的方法
- (NSComparisonResult)compare:(MyClass *)object;NSComparisonResult是一个枚举,定义如下
enum {
NSOrderedAscending = -1,
NSOrderedSame,
NSOrderedDescending
};
typedef NSInteger NSComparisonResult;NSOrderedAscending意味着左操作数比右操作数小(从这个操作数中可以得到其他操作数)。
备注
值得强调的是,Objective和密切相关的基础框架是建立在约定基础上的。它们不仅仅是一种惯用的写作方式,因为有时实现依赖于它们。例如,如果您实例化NSSortDescriptor而不指定自定义选择器,则默认实现将调用对象上的compare:。(举个例子,向大卫·隆奎斯特致敬)
另一个值得注意的例子是方法的命名约定。以init开头的实例方法将返回一个具有+1保留计数的对象。这是如此强大的惯例,随着ARC的到来,has been formalized和内置到编译器中。
总结一下:约定总是很重要的。在目标-C中,它们有时是基本的。
发布于 2013-08-22 12:55:47
你应该实现
- (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“上的CustomClass,并使用结果对数组进行排序。注意,如果您的类没有实现compare:,它将因此而崩溃(排序时)。
发布于 2013-08-22 12:56:48
compare:方法存在于NSString、NSDate、NSNumber和其他类中。他们都会返回NSComparisonResult。
https://stackoverflow.com/questions/18381035
复制相似问题