- 原文鏈接:Strings in Swift 2
- 原文作者: Apple
- 譯文出自:開發者前線 www.devtf.cn
- 譯者:MrLoong
- 校對者:MrLoong
- 狀態:完成
Strings 在 Swift 2中字符串設計的背後思想
swift提供高性能,兼容Unicode的string作爲標準庫的一部分,在 Swift 2.0,String類型不再符合CollectionType協議,曾經String是字符的集合,類似於array。現在,String提供了一個公開字符集視圖的charactes屬性
爲什麼會變?雖然模擬一個字符串作爲字符集合他看起來很自然,但是String類型的行爲還是與Array,Set,Dictionary這種集合類型有很大的區別的。這一直存在着,但是隨着Swift 2協議擴展的增加,這些差異使得有必要做出一些基本的改變。
與之不同的Sum
當你添加一一個元素到集合中,你期望集合將包含這個元素。就是說,當你將一個值添加到數組中時,該數組包含該值。就像應用dictionary或set。然而,當你在一個string中添加一個組合標記字符串,字符串本身的內容被更改。
考慮字符串cafe,其中有四個字符串:c,a,f和e:
var letters: [Character] = ["c", "a", "f", "e"]
var string: String = String(letters)
print(letters.count) // 4
print(string) // cafe
print(string.characters.count) // 4
如果你添加一個組合字符U+0301和´,字符串仍然有四個字符,但是現在最後一位時é
let acuteAccent: Character = "\u{0301}" // ´ COMBINING ACUTE ACCENT' (U+0301)
string.append(acuteAccent)
print(string.characters.count) // 4
print(string.characters.last!) // é
在剛剛這個字符串的字符屬性不包涵原始的小寫字母e,也不包涵´,知識附加。相反字符串中現在包涵一個小寫“e”,帶有é:
string.characters.contains("e") // false
string.characters.contains("´") // false
string.characters.contains("é") // true
如果我們像其它集合那樣處理字符串,這個結果將會讓我們驚訝,添加UIColor.redColor()和UIColor.greenColor()然後設置他包涵UIColor.yellowColor().
根據文字內容判斷
字符串和集合之間的另一個區別是他們確定相等的方式
- 如果兩個array都有相同的數目,並且每對元素在相應的指數是相等的,兩個array相等。
- 如果兩個sets都有相同的數目,並且並且每個元素包含在第一個元素也包含在第二個。
- 如果兩個dictionaries有相同的key,value,則兩個dictionaries相等
然而string基於正則等價平等。如果有相同的語言意思和外觀特徵,甚至如果他們由不同的Unicode組成,則表示等效。
考慮下韓語協作系統,由24個字母組成,它由24個字母組成,或是Jamo,代表個別的輔音和元音。當把這些字母寫出來的時候,每個音節都是字母組合起來的。字符“가”([GA])是由字母“ᄀ”([ ])和“ᅡ”[一]。在swift,字符串是相同的無論是由分解或預作字符序列:
let decomposed = "\u{1100}\u{1161}" // ᄀ + ᅡ
let precomposed = "\u{AC00}" // 가
decomposed == precomposed // true
同樣,這種行爲與任何快速的收集類型有很大的不同。這將是令人驚訝的價值��和��被認爲等於��陣列。
取決於你的觀點
- characters is a collection of Character values, or extended grapheme clusters.
- unicodeScalars is a collection of Unicode scalar values.
- utf8 is a collection of UTF–8 code units.
- utf16 is a collection of UTF–16 code units.
如果我們把“CAFé”前面的例子,由分解的特徵【C,A,F,E ]和[´],這裏有各種字符串的視圖將包括:
- characters屬性段的文本擴展字形集羣,這是一個近似的用戶感知的字符(在這種情況下,c++,f)。因爲一個字符串必須遍歷它的每一個位置(每個位置稱爲一個代碼點)爲了確定字符邊界.訪問此屬性的線性輸出O(n)時間。當處理字符串包含人類可讀的文本,高級語言環境敏感的Unicode編碼算法,尤其使用localizedstandardcompare用(_:)方法和localizedlowercasestring財產,應優先採用字符處理的特點。
- UTF8,UTF16性質爲UTF 8和16表示–utf–提供代碼.這些值對應於將實際的字節寫入到一個文件,當翻譯到和從一個特定的編碼。UTF-8編碼單元被許多POSIX字符串處理API.而UTF-16代碼單元中使用的Cocoa & Cocoa Touch表示字符串的長度和偏移量。
有關字符串和字符的快速工作的更多信息, 閱讀 The Swift Programming Language 和 the Swift Standard Library Reference.