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

标签 swift string subscript

我想弄清楚为什么以下内容适用于第一个字符串簇(字符)而不适用于第二个字符串簇。也许 endIndex 不能应用于另一个字符串?

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(part) 为真。

快速拼图。

最佳答案

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

在这种特殊情况下,part.endIndex(这是 part 字符串的“结束位置”)返回

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

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

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
    }
}

关于Swift 3 下标范围适用于第一个集群但不适用于中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42314912/

相关文章:

arrays - swift 语法 : index of array element accessed in setter?

swift - 禁用相机 View 增长动画

ios - Iphone 模拟器无法定位

string - 使用 db 在程序集 NASM 中声明字符串

java - 如何在 Java 中比较字符串?

ios - UITextView 中的子/上标

ios - 如何使以下调用中的属性可选(即允许 nil)

ios - 在另一个 View Controller 中调用方法,但不继续调用它?

python - 如何在 Python 2.7 中将 unicode 字符串转换为字符串文字?

c++ - 模板函数 "Subscript requires array type",但适用于较小的项目。为什么?