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

i_a*_*orf 1 objective-c foundation ios nsrange

来自苹果的文档

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

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

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

(lldb) p rangeOne
(NSRange) $3 = location=11, length=4
(lldb) p rangeTwo
(NSRange) $4 = location=14, length=0
Run Code Online (Sandbox Code Playgroud)

我计算交集:

NSRange intersection = NSIntersectionRange(rangeOne, rangeTwo);
Run Code Online (Sandbox Code Playgroud)

结果是:

(lldb) p intersection
(NSRange) $5 = location=14, length=0
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*mas 5

你是对的。您必须使用文档。该值无法使用。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);
}
Run Code Online (Sandbox Code Playgroud)

返回值是正确答案。您有一个从 14 位置开始的范围,其长度为 0。长度为 0 并不意味着该范围无效。

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

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

结果是

2014-06-27 14:29:53.610 TestApp[10501:303] abcd123efg
Run Code Online (Sandbox Code Playgroud)

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

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

  • @jeffamaphone 好的,我明白了。哇,这对苹果来说是糟糕的设计。您必须使用文档,长度为 0 表示结果不可靠。 (3认同)