这两个范围是否相交? 如果是这样,我怎么知道?

来自Apple的文档 :

返回值描述range1和range2的交集的范围,即包含两个范围中存在的索引的范围。

讨论如果返回的范围的长度字段为0,则两个范围不相交,并且位置字段的值未定义。

好的,我们假设我有两个范围:

(lldb) p rangeOne (NSRange) $3 = location=11, length=4 (lldb) p rangeTwo (NSRange) $4 = location=14, length=0 

我计算了交点:

 NSRange intersection = NSIntersectionRange(rangeOne, rangeTwo); 

结果是:

 (lldb) p intersection (NSRange) $5 = location=14, length=0 

我该怎么办呢? 长度为零,所以位置未定义? 但在这种情况下,结果就是我所期望的; 我可以相信吗? 计算一个范围长度为零的范围的交集无效吗?

你是对的。 你必须使用文档。 该值无法使用。 API中有什么漏洞!


作为一个快速的想法,类似于汤米的回答,这是一个具有更强承诺的版本

 // Like NSIntersectionRange() except it returns location of NSNotFound and // length of NSNotFound when the ranges do not intersect. static inline NSRange MyIntersectionRange(NSRange range1, NSRange range2) { if (range1.location == NSNotFound || range1.length == NSNotFound || range2.location == NSNotFound || range2.length == NSNotFound) return NSMakeRange(NSNotFound, NSNotFound); NSUInteger begin1 = range1.location; NSUInteger end1 = range1.location + range1.length; NSUInteger begin2 = range2.location; NSUInteger end2 = range2.location + range2.length; if (end1 <= begin2 || end2 <= begin1) return NSMakeRange(NSNotFound, NSNotFound); NSUInteger begin = MAX(begin1, begin2); NSUInteger end = MIN(end1, end2); return NSMakeRange(begin, end - begin); } 

返回的值是正确的答案。 您的范围从14开始,长度为0.长度为0并不表示范围无效。

这是一个使用长度为0的示例。

 NSString *x = @"abcdefg"; NSString *y = @"123"; NSRange range = NSMakeRange(4, 0); NSString *z = [x stringByReplacingCharactersInRange:range withString:y]; NSLog(@"%@", z); 

结果是

 2014-06-27 14:29:53.610 TestApp[10501:303] abcd123efg 

在此示例中,长度为0表示该位置是插入点,并且不会删除任何现有字符串。

如果您需要不同的答案,请自行计算。

我不认为NSIntersectionRange公开了那些信息,这是荒谬的,因为他们可以将location设置为NSNotFound或其他东西。 所以你必须手动完成。 我怀疑你需要博览会,但是例如:

 BOOL NSRangeIntersectsRange(NSRange range1, NSRange range2) { if(range1.location > range2.location + range2.length) return NO; if(range2.location > range1.location + range1.length) return NO; return YES; } 

(可能使用比NS更合适的方法名称前缀)

如果返回的范围的长度字段为0,则两个范围不相交,并且位置字段的值未定义。

我将其解释为当length为0时,范围不相交。

 BOOL RangesIntersect(NSRange range1, NSRange range2) { return NSIntersectionRange(range1, range2).length != 0; } 

同意Tommy – 他们可以将它设置为NSNotFound – 但他们说结果是未定义的。 此外,我同意零长度范围的位置是没有意义的。 范围内的位置rangeTwo并不意味着什么。 范围也不能与任何东西相交。

“我该怎么办呢?”

NSIntersectionRange正在按预期工作。 如果它不符合您的需求,您可以自己编写。

“计算一个范围长度为零的范围的交集是否无效?”

它并非无效,但显而易见:它们不是因为它们不能。