為什么Swift中字符串不能直接通過索引取字符?

在日常的開發(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ù)字索引單純的通過偏移量去獲取指定位置的字符。

參考文章:
NSString 與 Unicode
Swift Document

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容