如何比较 NSUUID
Posted
技术标签:
【中文标题】如何比较 NSUUID【英文标题】:How to compare NSUUID 【发布时间】:2013-12-11 17:23:10 【问题描述】:比较两个NSUUIDs
的最佳(最少代码、最快、最可靠)方法是什么?
这是一个例子:
-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2
return ... // YES if same or NO if not same
【问题讨论】:
【参考方案1】:来自 NSUUID 类参考:
注意:NSUUID 类不是与 CoreFoundation 的免费桥接的 CFUUID参考。使用 UUID 字符串在 CFUUID 和 NSUUID 之间进行转换,如果 需要。不保证两个 NSUUID 对象具有可比性 指针值(如 CFUUIDRef 一样);使用 isEqual: 比较两个 NSUUID 实例。
所以只需使用以下内容:
-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2
return [uuid1 isEqual:uuid2];
【讨论】:
是否有必要进行比较,因为 [nil isEqual:uuid2] 也会返回 NO,对吗?【参考方案2】:您不需要为此创建额外的方法,因为 documentation 声明
不保证 NSUUID 对象可以通过指针值进行比较 (因为 CFUUIDRef 是);使用 isEqual: 比较两个 NSUUID 实例。
那么就做BOOL sameUUID = [uuid1 isEqual:uuid2];
【讨论】:
我会对投反对票的原因感兴趣。 “额外方法”的目的只是为了进一步解释问题。我也会对对该问题投反对票的原因感兴趣;-)。【参考方案3】:NSUUID 有效地包装了 uuid_t。
解决方案...
@implementation NSUUID ( Compare )
- ( NSComparisonResult ) compare : ( NSUUID * ) that
uuid_t x;
uuid_t y;
[ self getUUIDBytes : x ];
[ that getUUIDBytes : y ];
const int r = memcmp ( x, y, sizeof ( x ) );
if ( r < 0 )
return NSOrderedAscending;
if ( r > 0 )
return NSOrderedDescending;
return NSOrderedSame;
@end
【讨论】:
这很重要,因为 NSSortDescriptor 使用 compare: 方法。我将 NSFetchedRequest 与 NSPredicate 和 NSSortDescriptor 一起使用,它是按 uuid 属性排序的并且发生了崩溃(没有比较:选择器与 NSUUID 一起存在) - 这修复了它。谢谢。【参考方案4】:一个合理的简单方法是使用字符串比较。但是,使用底层CFUUIDRef
的方法可能更快。
-(BOOL)isUUID:(NSUUID*)uuid1 equalToUUID:(NSUUID*)uuid2
return [[uuid1 UUIDString] isEqualToString:[uuid2 UUIDString]];
【讨论】:
以上是关于如何比较 NSUUID的主要内容,如果未能解决你的问题,请参考以下文章
无法使用initWithUUIDString创建NSUUID
NSUUID 到 NSString 从 (CBPeripheral *)aPeripheral
Xamarin Studio btouch 不支持的字段类型:NSUuid
iOS ibeacon 标识符 initWithProximityUUID:(NSUUID *)proximityUUID identifier:(NSString *)identifier?