在日常的開發(fā)中,因為String遵循了Collection協(xié)議, 常把String當成數(shù)組來處理。
// 如
"abc".count
"abc".isEmpty
但是當我們像數(shù)組一樣通過索引去取值的時候,Xcode就會報錯。
[圖片上傳失敗...(image-e2e55d-1644836833690)]
需要我們通過String.Index類型來取值才不會報錯。
那么為什么String不可以直接通過數(shù)字索引來取值呢?
這里先說結(jié)論:
不同字符的Unicode標量不一致,也就不能通過數(shù)字索引單純的通過偏移量去獲取指定位置的字符。
在Swift中String是由Character組成的。
那么Character是由什么組成的呢? 在Swift文檔中是這樣解釋的:
The Character type represents a character made up of one or more Unicode scalar values
Character又是由Unicode標量(Unicode scalar)組成。
由于文字的多種多樣原因,從效率角度考慮。 Unicode是長度可變的。
我們會主觀的認為????和I都是一個字符。
但當我們?nèi)ゴ蛴????和I的標量個數(shù)時結(jié)果確不一樣。
[圖片上傳失敗...(image-f29ab8-1644836833690)]
例如有一個字符串是"love????666" 在XCode的中查看其內(nèi)存分布:
[圖片上傳失敗...(image-740f5a-1644836833690)]
中間的 F0 9F 87 A8 F0 9F 87 B3 即為 "????"
由此可見。字符串中不同的字符所占據(jù)的內(nèi)存大小也不同。
正因為不同字符在內(nèi)存中的寬度不一致,也就不能通過數(shù)字索引單純的通過偏移量去獲取指定位置的字符。