成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讀懂Swift 2.0中字符串設計思路的改變

移動開發
Swift提供了一種高性能的,兼容Unicode編碼的String實現作為標準庫的一部分。在Swift2中,String類型不再遵守CollectionType協議。在以前,String類型是字符的一個集合,類似于數組。現在,String類型通過一個characters屬性來提供一個字符的集合。

[[146697]]

Swift提供了一種高性能的,兼容Unicode編碼的String實現作為標準庫的一部分。在Swift2中,String類型不再遵守CollectionType協議。在以前,String類型是字符的一個集合,類似于數組。現在,String類型通過一個characters屬性來提供一個字符的集合。

為什么會有這樣的變化呢?雖然模擬一個字符串作為字符的集合看起來非常自然,但是String類型與真正的集合類如Array、Set以及Dictionnary等類型表現得完全不同。這是一直都存在的,但是由于Swift2中增加了協議擴展,這些不同就使得很有必要做些基本改變。

不同于部分的總和

當你在集合中添加一個元素時,你希望集合中包含那個元素。也就是說,當你給一個數組增加一個值,這個數組就包含了那個值。這同樣適用于Dictionary和Set。無論如何,當你給字符串拼接一個組合標記字符(combing mark character)時,字符串本身的內容就改變了。

比如字符串cafe,它包含了四個字符:c,a,f ,e:

  1. var letters: [Character] = ["c""a""f""e"
  2. var string: String = String(letters) 
  3.   
  4. print(letters.count) // 4 
  5. print(string) // cafe 
  6. print(string.characters.count) // 4 

如果你在字符串后面拼接了組合重音符號U+0301  ? ,字符串仍然有四個字符,但是***的字符現在是é:

  1. let acuteAccent: Character = "\u{0301}" // ′ COMBINING ACUTE ACCENT' (U+0301) 
  2.   
  3. string.append(acuteAccent) 
  4. print(string.characters.count) // 4 
  5. print(string.characters.last!) // é 

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

  1. string.characters.contains("e"// false 
  2. string.characters.contains("?"// false 
  3. string.characters.contains("é"// true 

如果你想要將字符串像其他集合類型那樣看待,這種結果很令人驚訝,就像你在一個集合中添加了UIColor.redColor()和UIColor.greenColor(),但是集合會報告它自己包含了一個UIColor.yellowColor()

通過字符內容判斷

字符串與集合之間另一個不同是它們處理“相等”的方式。

  • 只有在兩個數組的元素個數相同,并且在每一個對應索引位置的元素也相等時兩個數組才是相等的。

  • 只有在兩個集合的元素個數相同,并且***個集合中包含的元素,第二個集合也包括時兩個集合才相等。

  • 兩個字典只有在有相同的鍵值對時才相等。

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

考慮韓國的書寫系統,包含了24個字母,或者叫Jamo,包含了單個的輔音和元音。當寫出時這些字母就組成每個音節對應的字符。例如,字符13.jpg13.jpg ([ga])是由字母14.jpg ([g])和15.jpg[a]構成的。在Swift中,無論字符串是由分解的還是組合的字符構成的,都被認為是相等的。

16.jpg

這種行為再一次與Swift中的集合類型區別開來。這很令人驚訝就像是數組中的值 [[146703]][[146704]]被認為和[[146705]]相等。

 

取決于你的視角

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

characters是Character類型值的集合,或者擴展字形群集(extended grapheme clusters

unicodeScalars是Unicode量值的集合(Unicode scalar values

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

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

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

QQ截圖20150824161609.jpg

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 中關于字符和字符串的信息,請看The Swift Programming Language和 The Swift Standard Library Reference.

責任編輯:倪明 來源: 蘋果開發者中心
相關推薦

2010-06-28 15:18:51

SQL Server

2021-03-11 18:44:39

字符串SQL表達式

2010-09-06 17:30:46

SQL函數

2021-09-10 08:18:31

Go語言字符串

2016-12-30 13:32:24

字符串算法代碼

2009-02-24 15:39:27

字符串比較函數函數

2011-06-08 15:45:41

字符串JAVA

2011-07-11 16:00:22

字符串拼接

2021-09-07 09:23:07

C++字符串算法

2020-09-03 10:13:49

JavaScript字符串pad

2016-12-30 13:37:50

字符串算法代碼

2010-09-09 11:48:00

SQL函數字符串

2010-03-16 17:14:19

Python字符串

2015-06-09 14:43:36

javascript操作字符串

2024-12-05 10:29:13

Rust字符串類型

2023-10-08 08:37:28

SQL字符串數據

2010-11-26 11:08:20

MySQL字符串

2016-12-30 13:16:51

字符串算法代碼

2010-11-25 15:59:33

字符串.NET

2012-01-11 09:15:45

Objective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: h小视频| 国产精品亚洲综合 | 羞羞的视频免费看 | 一区二区三区四区在线播放 | 精品视频一区二区三区在线观看 | 成人精品久久久 | 欧美日韩视频网站 | 色天天综合 | aaaa网站| 精品国产91 | 亚洲综合久久久 | 成人免费一区二区三区视频网站 | 一道本在线 | www.欧美.com | www久久爱 | 欧美日韩视频在线 | 国产精品中文 | 99精品久久久国产一区二区三 | 日韩在线观看视频一区 | 欧美精品一区二区三区在线播放 | 成人h视频在线观看 | 亚洲一级视频在线 | 欧美色视频免费 | 九九久久国产 | 国产美女在线观看 | 久久久久久免费免费 | 日韩综合在线 | 久久精品中文 | 在线观看中文字幕av | 亚洲精品大全 | 欧美日韩在线观看一区二区三区 | 亚洲一区二区三区免费视频 | 欧美激情亚洲 | 免费高潮视频95在线观看网站 | 日本精品一区二区三区在线观看 | 日本一二区视频 | 午夜欧美| 粉嫩一区二区三区四区公司1 | 精品成人一区二区 | 久久久精品视频一区二区三区 | 欧美激情国产精品 |