从苹果公司的文件 :
返回值描述范围1和的交点A范围范围2,也就是说,含有存在于两个范围的索引的范围内。
讨论如果返回的范围的长度字段为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;
}
与托米同意 - 他们可以将其设置为NSNotFound - 而是他们说的结果是不确定的。 此外,我同意零长度范围的位置是没有意义的。 在该位置rangeTwo
并不意味着什么。 也不能rangeTwo
与任何交叉。
这是不是一个错误。您的范围内的两个具有0长度所以它是一样没有存在的......所以,当你做NSRange路口= NSIntersectionRange(RangeOne中,为RangeTwo),当然有交集长度为0,因为你不能相交的东西具有0长度!!
“那我是做些什么?”
如预期NSIntersectionRange正在做的工作。 如果它不能满足你的需求,你可以写你自己的。
“是计算范围的交叉点,其中一个范围具有零无效的长度?”
这不是无效的,但很明显:他们不这样做,因为他们不能。