Swift 3 字符串的進(jìn)化

原文: Updating Strings for Swfit 3
作者: kharrison
譯者: kemchenj

我去年寫了一篇 Swift String Cheat Sheet 來幫助我記憶如何使用 Swift 標(biāo)準(zhǔn)庫里的那些難用的 API, 在痛苦的版本遷移之后, Swift 3有了明顯的改善, 這一部分得歸功于新的 API 命名規(guī)范, 還有 Collections 集合, indicates 索引和 ranges 范圍的一種新的運(yùn)作方式.

這里有我關(guān)于 Swift 3的遷移工作的總結(jié) Swift playground.

更好的 API 命名

標(biāo)準(zhǔn)庫采用了新的 API 命名規(guī)范 API guidelines 之后, String 的屬性和方法都有了很多改變. 因?yàn)榇蟛糠?API 命名的變化 Xcode 都會(huì)自動(dòng)幫你修正, 所以我不會(huì)在這里把全都都列出來. 這里列出一些典型的改變讓你能更好的了解這次變化:

初始化一個(gè) String

標(biāo)準(zhǔn)庫把 String 的初始化方法 init(count: repeatedValue:) 改成了 init(repeating: count:), repeatedValue 的類型也從 Character 字符換成了 String 字符串去獲得更多靈活性:

// Swift 2
let h = String(count:3, repeatedValue:"0") // "000"

// Swift 3
let h = String(repeating:"01", count:3)    // 010101

大小寫轉(zhuǎn)換

uppercaseStringlowercaseString 兩個(gè)屬性現(xiàn)在變成了函數(shù), 重新命名為 uppercased()lowercased():

let mixedCase = "AbcDef"

// Swift 2
// let upper = mixedCase.uppercaseString // "ABCDEF"
// let lower = mixedCase.lowercaseString // "abcdef"

// Swift 3
let upper = mixedCase.uppercased()       // "ABCDEF"
let lower = mixedCase.lowercased()       // "abcdef"

接下來我還會(huì)講到一些別的命名的變化

使用索引去訪問集合

Swift 3 里對于 String 影響最大的一個(gè)變化就是 new model for collections and indices. 總結(jié)起來就是你不能直接訪問 String 里的元素, 而必須使用索引去從集合里把元素取出來:

let country = "Espa?a"
country.characters       // characters
country.unicodeScalars   // Unicode scalar 21-bit codes
country.utf16            // UTF-16 encoding
country.utf8             // UTF-8 encoding

Swift 3里每個(gè)集合的 view 里的 startIndexendIndex 屬性還是沒變:

let hello = "hello"
let helloStartIndex = hello.characters.startIndex // 0

如果想要獲取字符的集合, 你也可以使用 characters 屬性:

(譯者注: characters 能夠自動(dòng)幫助我們處理編碼問題, 讓我們獲得人類理解的"字符集合". Swift 的字符串 API 剛接觸可能會(huì)覺得很難用, 但了解了背后的原理之后, 會(huì)發(fā)現(xiàn)它其實(shí)做了很多, 幫我們避開了很多坑, 了解方法之后也很容易使用)

let startIndex = hello.startIndex // 0
let endIndex = hello.endIndex     // 5
hello[startIndex]                 // "h"

之前通過增減索引去訪問字符串的方式改變了, successor(), predecessor()advancedBy(n) 的函數(shù)都去掉了.

// Swift 2
hello[hello.startIndex]                // "h"
hello[hello.startIndex.successor()]    // "e"
hello[hello.endIndex.predecessor()]    // "o"
hello[hello.startIndex.advancedBy(2)]  // "l"

現(xiàn)在在 Swift 3 里你會(huì)使用 index(after:), index(before:)index(_: offsetBy:) 去處理相同的情況:

// Swift 3
hello[hello.startIndex]                // "h"
hello[hello.index(after: startIndex)]  // "e"
hello[hello.index(before: endIndex)]   // "o"

hello[hello.index(startIndex, offsetBy: 1)]  // "e"
hello[hello.index(endIndex, offsetBy: -4)]   // "e"

你也可以給 offset 加上限制, 避免錯(cuò)誤的下標(biāo)訪問. 函數(shù) index(_: offsetBy: limitedBy:) 會(huì)返回一個(gè)可選值, 下標(biāo)越界的時(shí)候就會(huì)返回 nil:

if let someIndex = hello.index(startIndex,
                   offsetBy: 4, limitedBy: endIndex) {
  hello[someIndex] // "o"
}

找到第一個(gè)符合條件的元素<T>的方式(在這種情況下, T 是一個(gè)字符串):

let matchedIndex = hello.characters.index(of: "l") // 2
let nomatchIndex = hello.characters.index(of: "A") // nil

最后, 獲取兩個(gè)索引之間距離的方法現(xiàn)在也被重新命名了:

// Swift 2
let distance = word1.startIndex.distanceTo(indexC)

// Swift 3
let distance = word1.distance(from: word1.startIndex, to: indexC)

使用 Ranges (范圍)

Swift 3 里對 Ranges 進(jìn)行了修改. 假設(shè)我有字符集合的一個(gè)起始索引值和一個(gè)終點(diǎn)索引值:

let fqdn = "useyourloaf.com"
let tldEndIndex = fqdn.endIndex
let tldStartIndex = fqdn.index(tldEndIndex, offsetBy: -3)

用起始和終點(diǎn)索引去初始化 Range 的方式:

let range = Range(uncheckedBounds: (lower: tldStartIndex, upper: tldEndIndex))
fqdn[range]  // "com"

創(chuàng)建一個(gè)范圍最簡單的方法就是使用 ..<... 操作符:

let endOfDomain = fqdn.index(fqdn.endIndex, offsetBy: -4)
let rangeOfDomain = fqdn.startIndex ..< endOfDomain
fqdn[rangeOfDomain] // useyourloaf

查找和返回子字符串的范圍:

if let rangeOfTLD = fqdn.range(of: "com") {
  let tld = fqdn[rangeOfTLD]                 // "com"
}

Playground

你可以在這里找到一份完整的升級(jí)后的 API 變化的 playground 文件 Code Examples repository. 我也更新了之前我寫的那篇文章 original post.

參考閱讀

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佳恬,一起剝皮案震驚了整個(gè)濱河市岩榆,隨后出現(xiàn)的幾起案子爷速,更是在濱河造成了極大的恐慌接癌,老刑警劉巖凛捏,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富俄,死亡現(xiàn)場離奇詭異犹菱,居然都是意外死亡破托,警方通過查閱死者的電腦和手機(jī)查坪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門寸宏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人偿曙,你說我怎么就攤上這事氮凝。” “怎么了遥昧?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵覆醇,是天一觀的道長。 經(jīng)常有香客問我炭臭,道長永脓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任鞋仍,我火速辦了婚禮常摧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己落午,他們只是感情好谎懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溃斋,像睡著了一般界拦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梗劫,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天享甸,我揣著相機(jī)與錄音,去河邊找鬼梳侨。 笑死蛉威,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的走哺。 我是一名探鬼主播蚯嫌,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丙躏!你這毒婦竟也來了择示?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤晒旅,失蹤者是張志新(化名)和其女友劉穎对妄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敢朱,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剪菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拴签。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孝常。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚓哩,靈堂內(nèi)的尸體忽然破棺而出构灸,到底是詐尸還是另有隱情,我是刑警寧澤岸梨,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布喜颁,位于F島的核電站,受9級(jí)特大地震影響曹阔,放射性物質(zhì)發(fā)生泄漏半开。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一赃份、第九天 我趴在偏房一處隱蔽的房頂上張望寂拆。 院中可真熱鬧奢米,春花似錦、人聲如沸纠永。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尝江。三九已至涉波,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炭序,已是汗流浹背怠蹂。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留少态,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓易遣,卻偏偏與公主長得像彼妻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子豆茫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫侨歉、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 習(xí)慣六 統(tǒng)合綜效 【統(tǒng)合綜效的基本心態(tài)是:如果一位具有相當(dāng)聰明才智的人跟我意見不同揩魂,那么對方的主張必定有我尚未體會(huì)...
    雪23閱讀 209評論 0 0
  • 喜歡的歌就會(huì)像自己的孩子一樣火脉,容不得別人說她/他的不好牵舵。。倦挂。畸颅。。 我的孩子們吶方援,一直以來你們都是最能給我安慰的 所...
    顧君一笑閱讀 634評論 0 3
  • 我起床了没炒,發(fā)現(xiàn)身邊睡著一個(gè)女人。 她是我的妻子犯戏,是杰出的美人也是杰出的生物科學(xué)家送火!能找到她這樣的妻子,我很幸福先匪。 ...
    小小小2014閱讀 304評論 0 0
  • 《你是我心中的傷》 文/白傳英 你現(xiàn)在怎么想 是否和過去一個(gè)樣 我在你的眼里 沒有一次能夠順理成章 ...
    白清風(fēng)閱讀 245評論 0 0