在 swift 文档中,他们说他们使用 String.Index 来索引字符串,因为不同的字符可以占用不同的内存量。
但是我看到很多人将 String 转换为数组var a = Array(s)
,以便他们可以通过 int 而不是 String.Index 进行索引(这绝对更容易)
所以我想自己测试一下它是否对所有 unicode 字符都完全相同:
let cafeA = "caf\u{E9}" // eAcute
let cafeB = "caf\u{65}\u{301}" // combinedEAcute
let arrayCafeA = Array(cafeA)
let arrayCafeB = Array(cafeB)
print("\(cafeA) is \(cafeA.count) character \(arrayCafeA.count)")
print("\(cafeB) is \(cafeB.count) character \(arrayCafeB.count)")
print(cafeA == cafeB)
print("- A scalar")
for scalar in cafeA.unicodeScalars {
print(scalar.value)
}
print("- B scalar")
for scalar in cafeB.unicodeScalars {
print(scalar.value)
}
这是输出:
café is 4 character 4
café is 4 character 4
true
- A scalar
99
97
102
233
- B scalar
99
97
102
101
769
果然,正如文档中提到的那样,字符串只是一个字符数组,然后字素簇在字符对象中向下,那么他们为什么不通过 int 对其进行索引呢?实际上创建/使用 String.Index 有什么意义?