使用compare:options:range:比较不同长度的字符串会产生错误结果。

3
为什么这个比较结果会是NO
BOOL areTheSame = NSOrderedSame == [@"th" compare:@"They" options:NSCaseInsensitiveSearch range:NSMakeRange(0, 2)];

当我测试 @"th"@"Th" 时,它返回 YES

我错过了什么?


有趣的是,使用“th”和“they”时,比较函数的行为会有什么不同呢?如果使用NSCaseInsensitiveSearch,会有什么区别吗? - Mattias Wadman
使用选项0会得到相同的结果。奇怪。。 - k3a
1个回答

6
这很反直觉,但是range参数只适用于接收器。另一个字符串的长度(传递给compare:的参数)没有范围限制。您的调用将@"th"缩小到范围{0,2},这将产生@"th"(即没有效果),然后将其与@"They"进行比较。
您会发现这段代码:
NSComparisonResult comp = [@"They" compare:@"th" 
                                   options:NSCaseInsensitiveSearch 
                                     range:NSMakeRange(0, 2)];
BOOL areTheSame = comp == NSOrderedSame;

使用这种方法得到了你所期望的结果,因为它截取了接收器(@"They")的一部分(变成了@"Th"),然后进行比较。


谢谢回答。是的,我认为这是设计缺陷。 - k3a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接