Swift中字串的儲存機制與其它語言不同,採用的不是固定位元組方式儲存字元,每個字元佔用的位元組數可能不同。
當我們需要知道一個字串有多少字串時,我們往往想知道的是我們所看到的字元數,而非儲存的位元組數。
一個字元可能需要1,2,3,4個位元組來儲存。
英文:1個位元組
xxx: 2 個位元組。 --- 沒找到例子
中文:3個位元組
emoji表情字元:4個位元組
charaters.count表示有多少字元,也就是我們所見到有幾個字元,而不關心其儲存方式。
與unicodeScalars.count是一樣的。
for codeUnit in language.utf8{ print("utf8:\(codeUnit) ", terminator: "")}print("\n")for codeUnit in language.utf16{ print("utf16:\(codeUnit) ", terminator: "")}結果:utf8:83 utf8:119 utf8:105 utf8:102 utf8:116 utf8:232 utf8:175 utf8:173 utf8:232 utf8:168 utf8:128 utf16:83 utf16:119 utf16:105 utf16:102 utf16:116 utf16:35821 utf16:35328
為了方便使用,我們可以擴充String的屬性:
//自訂字串長度的計算屬性extension String{ var length: Int { return self.characters.count }}
language.length //returns 7
我們再看看官方的例子,說的比較清楚:
這是一個混有不同類型字元的例子,狗頭是表情字元,佔用4個位元組。
1. utf8 表達:
可以看到佔用了10個位元組,即 dogString.utf8.count == 10
每個單位是 UInt8 類型
2. utf16表達:dogString.utf16.count == 6
每個單位是 unsigned int16類型
一個Emoji需要2個UInt16表示。
3. unicodeScalar 標量表示
dogString.unicodeScalars.count == 5
每個單位是UnicodeScalar,佔用UInt32的記憶體,持有21bit的資料。
Each UnicodeScalar has a value property that returns the scalar’s 21-bit value, represented within a UInt32value。
這種表達方式最接近我們所見到的內容。
參考連結:
Swift_Programming_Language:StringsAndCharacters