在日常的開發(fā)中专酗,因?yàn)镾tring遵循了Collection
協(xié)議睹逃, 常把String當(dāng)成數(shù)組來(lái)處理。
// 如
"abc".count
"abc".isEmpty
但是當(dāng)我們像數(shù)組一樣通過(guò)索引去取值的時(shí)候祷肯,Xcode就會(huì)報(bào)錯(cuò)沉填。
[圖片上傳失敗...(image-e2e55d-1644836833690)]
需要我們通過(guò)String.Index
類型來(lái)取值才不會(huì)報(bào)錯(cuò)。
那么為什么String不可以直接通過(guò)數(shù)字索引
來(lái)取值呢佑笋?
這里先說(shuō)結(jié)論:
不同字符的Unicode標(biāo)量不一致翼闹,也就不能通過(guò)數(shù)字索引單純的通過(guò)偏移量去獲取指定位置的字符。
在Swift中String是由Character組成的蒋纬。
那么Character是由什么組成的呢猎荠?
在Swift文檔中是這樣解釋的:
The Character type represents a character made up of one or more Unicode scalar values
Character又是由Unicode標(biāo)量(Unicode scalar)組成。
由于文字的多種多樣原因蜀备,從效率角度考慮
关摇。 Unicode是長(zhǎng)度可變的。
我們會(huì)主觀的認(rèn)為????和I都是一個(gè)字符琼掠。
但當(dāng)我們?nèi)ゴ蛴????和I的標(biāo)量個(gè)數(shù)時(shí)結(jié)果確不一樣拒垃。
[圖片上傳失敗...(image-f29ab8-1644836833690)]
例如有一個(gè)字符串是"love????666" 在XCode的中查看其內(nèi)存分布:
[圖片上傳失敗...(image-740f5a-1644836833690)]
中間的 F0 9F 87 A8 F0 9F 87 B3 即為 "????"
由此可見。字符串中不同的字符所占據(jù)的內(nèi)存大小也不同瓷蛙。
正因?yàn)椴煌址趦?nèi)存中的寬度不一致悼瓮,也就不能通過(guò)數(shù)字索引單純的通過(guò)偏移量去獲取指定位置的字符。