Strings 在 Swift 2中字符串設計的背後思想

Strings 在 Swift 2中字符串設計的背後思想

swift提供高性能,兼容Unicode的string作爲標準庫的一部分,在 Swift 2.0,String類型不再符合CollectionType協議,曾經String是字符的集合,類似於array。現在,String提供了一個公開字符集視圖的charactes屬性

爲什麼會變?雖然模擬一個字符串作爲字符集合他看起來很自然,但是String類型的行爲還是與ArraySetDictionary這種集合類型有很大的區別的。這一直存在着,但是隨着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

同樣,這種行爲與任何快速的收集類型有很大的不同。這將是令人驚訝的價值��和��被認爲等於��陣列。

取決於你的觀點

如果我們把“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 Languagethe Swift Standard Library Reference.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章