讀懂Swift 2 0中字串設計思路的改變

2021-07-07 10:58:06 字數 2791 閱讀 7318

swift提供了一種高效能的,相容unicode編碼的string實現作為標準庫的一部分。在swift2中,string型別不再遵守collectiontype協議。在以前,string型別是字元的乙個集合,類似於陣列。現在,string型別通過乙個characters屬性來提供乙個字元的集合。

為什麼會有這樣的變化呢?雖然模擬乙個字串作為字元的集合看起來非常自然,但是string型別與真正的集合類如array、set以及dictionnary等型別表現得完全不同。這是一直都存在的,但是由於swift2中增加了協議擴充套件,這些不同就使得很有必要做些基本改變。

不同於部分的總和

當你在集合中新增乙個元素時,你希望集合中包含那個元素。也就是說,當你給乙個陣列增加乙個值,這個陣列就包含了那個值。這同樣適用於dictionary和set。無論如何,當你給字串拼接乙個組合標記字元(combing mark character)時,字串本身的內容就改變了。

比如字串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" // ′ combining acute accent' (u+0301)

print(string.characters.count) // 4

print(string.characters.last!) // é

字串的characters屬性不包含原始的小寫字母 e,它也不包含剛剛拼接的重音符號?,字串現在是乙個帶著重音符號的小寫字母é:

string.characters.contains("e") // false

string.characters.contains("?") // false

string.characters.contains("é") // true

如果你想要將字串像其他集合型別那樣看待,這種結果很令人驚訝,就像你在乙個集合中新增了uicolor.redcolor()和uicolor.greencolor(),但是集合會報告它自己包含了乙個uicolor.yellowcolor()

通過字元內容判斷

字串與集合之間另乙個不同是它們處理「相等」的方式。

然而,string型別的相等建立在標準相等的基礎上。如果兩個字串有相同的語義和外觀,即使它們實際上是用不同的unicode碼構成的,它們也是標準相等的。

考慮南韓的書寫系統,包含了24個字母,或者叫jamo,包含了單個的子音和母音。當寫出時這些字母就組成每個音節對應的字元。例如,字元

這種行為再一次與swift中的集合型別區別開來。這很令人驚訝就像是陣列中的值

取決於你的視角

字串不是集合。但是它們確實也提供了許多遵守collectiontype協議的views:

unicodescalars是unicode量值的集合(unicode scalar values)

utf8是utf-8編碼單元的集合(utf-8)

utf16是utf-16編碼單元的集合(utf-16)

讓我們來看之前單詞 「café」的例子,由幾個單獨的字元[ c, a, f, e ] 和 [ ? ]構成,下面是多種字串的views中所包含的內容:

characters屬性將文字分段為擴充套件字形群集,差不多接近使用者看到的字元(在這個例子中指c, a, f, 和 é)。由於字串必須對整個字串中的每乙個位置(稱為碼位(code point))進行迭代以確定字元的邊界,因此取得這個屬性的時間複雜度是線性的 o(n)。當處理包含了人類可讀文字的字串,以及上層的本地敏感的unicode計算程式時,例如用到的localizedstandardcompare(_:)方法和localizedlowercasestring 屬性,都需要將字元逐字進行處理。

unicodescalars屬性提供了儲存在字串中的量值,如果原始的字串是通過字元é而不是e + ?建立的,這就會通過unicodescalar屬性表示出來。當你對資料進行底層操作的時候使用這個api。

utf8和utf16屬性對應地提供了它們所代表的**點(code points),這些值與字串被轉化時寫入乙個檔案中的實際位元組數是相一致的,並且來自一種特定的編碼方式。

utf-8 編碼單元(code units)被許多 posix 的字串處理 api 所使用,而 utf-16 編碼單元(code units)則始終被用於表示 cocoa 和 cocoa touch中的字串長度和偏移量。

swift 過濾字串 Swift 字串

swift 字串 swift 字串是一系列字元的集合。例如 hello,world 這樣的有序的字元型別的值的集合,它的資料型別為 string。建立字串 你可以通過使用字串字面量或 string 類的例項來建立乙個字串 import cocoa 使用字串字面量 var stringa hello,...

swift 2 0 類中的計算屬性 唯讀屬性

接觸到乙個新的屬性定義 計算屬性 計算屬性,要注意的一點就是,他只管計算,並不會儲存資料。ui當中的應用場景,比如,我們賦給乙個ui控制項一定的frame,然後,我們就可以使用這個控制項的bounds和center,我們自己並沒有計算,而是直接就可以拿到的,所以人家內部是封裝好了的。class ci...

swift字串和字元

您可以在您的 中包含一段預定義的字串值作為字串字面量。字串字面量是由雙引號 包裹著的具有固定順序的文字字符集。字串字面量可以用於為常量和變數提供初始值 let somestring some string literal value 注意somestring常量通過字串字面量進行初始化,swift ...