首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-C compareTo:

目标-C compareTo:
EN

Stack Overflow用户
提问于 2013-08-22 12:51:59
回答 3查看 6.4K关注 0票数 11

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 13:05:18

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

NSStringNSNumber就是一些例子。

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

代码语言:javascript
复制
- (NSComparisonResult)compare:(MyClass *)object;

NSComparisonResult是一个枚举,定义如下

代码语言:javascript
复制
enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

NSOrderedAscending意味着左操作数比右操作数小(从这个操作数中可以得到其他操作数)。

备注

值得强调的是,Objective和密切相关的基础框架是建立在约定基础上的。它们不仅仅是一种惯用的写作方式,因为有时实现依赖于它们。例如,如果您实例化NSSortDescriptor而不指定自定义选择器,则默认实现将调用对象上的compare:。(举个例子,向大卫·隆奎斯特致敬)

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

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

票数 25
EN

Stack Overflow用户

发布于 2013-08-22 12:55:47

你应该实现

代码语言:javascript
复制
- (NSComparisonResult)compare:(CustomClass *)otherObject;

并返回NSOrderedAscendingNSOrderedDescendingNSOrderedSame

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

代码语言:javascript
复制
NSArray *unsorted = @[[CustomClass new], [CustomClass new], [CustomClass new]];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"self" 
                                                       ascending:NO]
NSArray *sorted = [unsorted sortedArrayUsingDescriptors:@[sort]];

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

票数 6
EN

Stack Overflow用户

发布于 2013-08-22 12:56:48

compare:方法存在于NSString、NSDate、NSNumber和其他类中。他们都会返回NSComparisonResult

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18381035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档