来自Apple的documentation:
返回值描述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
我该怎么办呢?长度为零,所以位置未定义?但在这种情况下,结果是我所期望的;我可以相信吗?计算一个范围长度为零的范围的交集是否无效?
答案 0 :(得分:3)
作为一个快速的想法,类似于汤米的答案,这是一个具有更强承诺的版本
// 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表示该位置是插入点,并且不会删除任何现有字符串。
如果您需要不同的答案,请自行计算。
答案 1 :(得分:2)
我不认为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
更合适的方法名称前缀)
答案 2 :(得分:1)
如果返回的范围的长度字段为0,则两个范围不相交,并且位置字段的值未定义。
我将其解释为当length
为0时,范围不相交。
BOOL RangesIntersect(NSRange range1, NSRange range2) {
return NSIntersectionRange(range1, range2).length != 0;
}
同意Tommy - 他们可以将它设置为NSNotFound - 但他们说结果是未定义的。此外,我同意零长度范围的位置是没有意义的。 rangeTwo
中的位置并不代表任何意义。 rangeTwo
也不能与任何事物相交。
答案 3 :(得分:0)
那不是错误。.您的范围2的长度为0,所以它不存在...所以当您执行NSRange相交= NSIntersectionRange(rangeOne,rangeTwo)时,当然相交的长度为0,因为您不能与长度为0的东西相交!
答案 4 :(得分:-2)
&#34;我应该怎么做?&#34;
NSIntersectionRange正在按预期工作。如果它不符合您的需求,您可以自己编写。
&#34;计算一个范围长度为零的范围的交集是否无效?&#34;
这不是无效的,但很明显:他们不会因为他们不能这样做。