簡體   English   中英

Swift String.Index vs將String轉換為數組

[英]Swift String.Index vs transforming the String to an Array

在swift doc中,他們說他們使用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

當然,正如doc字符串中提到的只是一個Character數組,然后字形集群在Character對象中,所以為什么不用int對它進行索引? 實際創建/使用String.Index有什么意義?

在String中,字節表示是打包的,因此無法從一開始就知道字符邊界的位置而不遍歷整個字符串。

轉換為數組時,這是遍歷完成一次,結果是在內存中等距間隔的字符數組,這允許通過Int索引進行常量時間下標。 重要的是,數組被保留,因此許多下標操作可以在同一個數組上完成,只需要遍歷String的字節,用於初始解包。

有可能使用下標來擴展String,並使用Int對其進行索引,並且您看到它經常出現在SO上,但這是不明智的。 標准庫程序員可以添加它,但是他們故意選擇不這樣做,因為它模糊了每個索引操作都需要單獨遍歷String的字節,即O(string.count)這一事實。 突然間,這樣無害的代碼:

for i in string.indices {
    print(string[i]) // Looks O(1), but is actually O(string.count)!
}

變成二次方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM