Swift 3下标范围适用于第一个集群但不适用于中间集群

时间:2017-02-18 12:06:23

标签: swift string subscript

我正在试图弄清楚为什么以下内容适用于第一个字符串集群(字符)但不适用于第二个字符串集群。也许endIndex不能应用于另一个String?

let part = "A"
let full = "ABC"

print(full[part.startIndex ... part.startIndex])                    // "A"
print(full[part.endIndex ... part.endIndex])                        // ""   <- ???
print(full[part.endIndex ... full.index(after: part.endIndex)])     // "B"

bSecond应该保持“B”,而是为空。但是,一个字符串索引适用于另一个字符串索引的证明是最后一个语句有效。

编辑: 假设full.hasPrefix(部分)为真。

快速谜题。

1 个答案:

答案 0 :(得分:1)

您不能使用一个字符串的索引来下标不同的索引 串。这可能是偶然的(在你的第一个例子中)或不是 (在你的第二个例子中),或在运行时崩溃。

在这种特殊情况下,part.endIndexpart字符串中的“一个超过结束位置”)返回

String.UnicodeScalarView.Index(_position: 1), _countUTF16: 0)
带有_countUTF16:

(这是“UTF-16代码单元中此扩展字形簇的数量”)为零,即它描述 没有范围的位置(在unicode标量视图中)。然后

full[part.endIndex ... part.endIndex]

返回一个空字符串。但这是一个实现细节 (比较StringCharacterView.swift)。真正的答案就是“你做不到”。

获得预期(?)结果的安全方法是

let part = "A"
let full = "ABC"

if let range = full.range(of: part) {
    print(full[range]) // A
    if range.upperBound != full.endIndex {
        print(full[range.upperBound...range.upperBound]) // B
    }
}