使用objective-c中的compare方法比较对象

时间:2013-02-26 19:54:38

标签: objective-c

如果我尝试比较objective-c中的两个对象,我相信在IOS 6中可以使用普通的运算符,例如==(下面的证明),但是,我想知道这是怎么回事使用-compare方法完成。

据我所知,compare方法以这种方式工作:

if ([objOne compare:objTwo] == NSOrderedAscending){
    // objOne is greater

首先,这是正确的吗?其次,其他比较方法是什么,即NSOrderedAscending?

enter image description here

1 个答案:

答案 0 :(得分:7)

一个类的作者是可以比较的,这意味着你必须定义两个对象何时相等。

这是通过定义一个方法compare:来完成的,该方法应返回NSOrderedAscending,NSOrderedDescending,NSOrderedSame

来自docs

  

<强> NSComparisonResult

     

这些常量用于指示请求中的项目   排序。

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

请注意,没有什么能阻止您创建返回NSComparisionResults的其他方法。 iE NSString有compare:caseInsensitiveCompare:

==只会检查身份:如果指针是相同的,这将返回true,而如果有不同的对象,但在修改相同的属性时相同,它仍将返回false


来自 NSComparisonMethods Protocol Reference

  

NSObject为许多这些方法提供的默认实现适用于实现单个比较方法的对象,其选择器,签名和描述符合以下条件:

- (NSComparisonResult)compare:(id)object;
     

如果接收器较少,此方法应返回NSOrderedAscending   比对象,NSOrderedDescending,如果接收器大于   如果接收者和对象相等,则为对象和NSOrderedSame。对于   例如,NSString不实现在其中声明的大多数方法   这个非正式协议,但NSString对象仍然处理消息   正确符合此协议,因为NSString实现了   比较:满足必要要求的方法。可可也   包括适当的比较:NSDate的方法实现,   NSDecimalNumber和NSValue类。

这意味着,如果您提供了-compare:方法,则还可以使用-isEqual:

if ([objOne isEqual:objTwo]){ //…

enter image description here