如果我尝试比较objective-c中的两个对象,我相信在IOS 6中可以使用普通的运算符,例如==(下面的证明),但是,我想知道这是怎么回事使用-compare方法完成。
据我所知,compare方法以这种方式工作:
if ([objOne compare:objTwo] == NSOrderedAscending){
// objOne is greater
首先,这是正确的吗?其次,其他比较方法是什么,即NSOrderedAscending?
答案 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]){ //…