Swift4.0新特性之String啊鸭、Array和Dictionary

Swift4.0新特性之String、Array和Dictionary


Swift 4是蘋(píng)果計(jì)劃在2017年秋季推出的最新版本,值得關(guān)注的是其提供了與Swift 3代碼很好的兼容性媒怯,并最大限度的保持了ABI穩(wěn)定性.

String

字符串已經(jīng)像之前的2.0版一樣, 改為了Collection類型 。此變化消除了字符串對(duì)字符數(shù)組的依賴

0.創(chuàng)建空字符串的兩種方式,可用isEmpty判斷是否為空

let SwiftString = "Hello"
var emptyString = ""               // empty string literal
var anotherEmptyString = String()

1.字符和字符串

1.1 遍歷字符串

for char in SwiftString {
    print(char)
}

1.2通過(guò) Character類型創(chuàng)建單個(gè)字符

let char : Character = "H"

1.3 String值可以通過(guò)傳入 Character來(lái)構(gòu)造:

let charArr : [Character] = ["H", "e", "l", "l", "o"]
print(String(char)) // H
print(String(charArr)) // Hello

1.4 拼接字符串

//方式一:
let addString = String(charArr) + String(char) //HelloH
//方式二:
var addString2 = "Why"
addString2 += String(charArr) //"WhyHello"

2.字符串個(gè)數(shù)

let count1 = SwiftString.count //5(類型: String.CharacterView.IndexDistance)
let count2 = SwiftString.characters.count // 5(Int型)
count1: 

3.是否為空

let isStr = SwiftString.isEmpty //false

4.去掉某一個(gè)或幾個(gè)字符

let text1 = SwiftString.dropFirst()//"ello"
let text2 = SwiftString.dropLast()//"Hell"
let text3 = SwiftString.dropFirst(2)//"llo"
let text4 = SwiftString.dropLast(2)//"Hel"
//注:以上皆為String.SubSequence類型
let text5 = String(text1) //"ello"---text5為String類型

5.倒敘

let text6 = String(SwiftString.reversed()) //"olleH"

6.字符串分割數(shù)組

let swiftString2 = "one two three"
let StrArr = swiftString2.split(separator: " ") //["one", "two", "three"]
//let StrArr: [String.SubSequence]

7.刪除不符合ASCII編碼的字符

let swiftString3 = "quanjun ??,"
let qj = swiftString3.filter { (char) -> Bool in
    return char.unicodeScalars.reduce(true, { $0 && $1.isASCII })
}
print(qj)  //"quanjun ,"

8. 字符串索引

  • Swift 的字符串不能通過(guò)整數(shù)值索引
  • 使用 index(before:) 和 index(after:) 方法來(lái)訪問(wèn)給定索引的前后髓窜。要訪問(wèn)給定索引更遠(yuǎn)的索引扇苞,你可以使用 index(_:offsetBy:) 方法而不是多次調(diào)用這兩個(gè)方法欺殿。
  • Swift 4添加了Substring類型,用于引用String的子序列鳖敷。
  • String和Substring都實(shí)現(xiàn)了StringProtocol脖苏,兩者幾乎具有相同的功能:

8.1 startIndex和endIndex

let greeting = "Guten Tag!"
//startIndex屬性來(lái)訪問(wèn) String中第一個(gè) Character的位置
print(greeting[greeting.startIndex])
print(greeting[greeting.index(after: greeting.startIndex)])
//endIndex屬性就是 String中最后一個(gè)字符后的位置。endIndex屬性并不是字符串下標(biāo)腳本的合法實(shí)際參數(shù)
//greeting[greeting.endIndex] //會(huì)報(bào)錯(cuò)
print(greeting[greeting.index(before: greeting.endIndex)])
//注: 如果 String為空定踱,則 startIndex與 endIndex相等

let index = greeting.index(greeting.startIndex, offsetBy: 2)
print(greeting[index])
let indesString = greeting[greeting.startIndex...index]  //"Gut"
//注:indesString : Substring類型
print(String(indesString)) //"Gut"

8.2使用 characters屬性的 indices屬性來(lái)創(chuàng)建所有能夠用來(lái)訪問(wèn)字符串中獨(dú)立字符的索引范圍 Range棍潘。

for index in greeting.characters.indices {
    print("\(greeting[index]) ", terminator: "")//不換行輸出
}

9.多行字符串

  • 注:你可以在多行字面量中使用單個(gè)雙引號(hào) " 。要在多行字符串中包含 """ 屋吨,你必須用反斜杠( \ )轉(zhuǎn)義至少其中一個(gè)雙引號(hào)
let rowsString = """
                我是一只小鴨子
                咿呀咿呀喲
                \"""
                """
print(rowsString)

Array

  • Swift 的 Array類型被橋接到了基礎(chǔ)框架的 NSArray類上蜒谤。
  • Swift 數(shù)組的類型完整寫(xiě)法是 Array<Element>, Element是數(shù)組允許存入的值的類型至扰。你同樣可以簡(jiǎn)寫(xiě)數(shù)組的類型為 [Element]鳍徽。

1. 創(chuàng)建確定大小且元素都設(shè)定為相同默認(rèn)值的數(shù)組。

/*Array*/
//默認(rèn)值(叫做 repeating)和新數(shù)組元素的數(shù)量(叫做 count)
var array1 = Array(repeating: 1, count: 2)
var array2 = Array(repeating: 3, count: 2)

2. 連接兩個(gè)數(shù)組來(lái)創(chuàng)建數(shù)組(類型必須一致)

var array3 = array1 + array2
print(array3) //[1, 1, 3, 3]

3. 數(shù)組個(gè)數(shù)

print(array3.count)  //5

4. 判斷數(shù)組個(gè)數(shù)是否為0

print(array3.isEmpty)  //false
print(array3.count == 0)  //false

5. 添加

array3.append(4) //[1, 1, 3, 3, 4]
array3 += [5]  //[1, 1, 3, 3, 4, 5]
array3 += [6, 5]  //[1, 1, 3, 3, 4, 5, 6, 5]

6. 取值

print(array3[0]) // 1
array3[1] = 9 // [1, 9, 3, 3, 4, 5, 6, 5]

//用下標(biāo)改變一個(gè)范圍的值敢课,就算替換與范圍長(zhǎng)度不同的值的合集也行
array3[2...4] = [0, 8] //[1, 9, 0, 8, 5, 6, 5]

7.遍歷

for item in array3 {
    print(item)
}
//元組輸出
for (index, item) in array3.enumerated() {
    print("\(index)---\(item)")
}
//倒敘輸出
for item in array3.reversed() {
    print(item)
}

//forEach遍歷,如同for-in
let arr = [1, 9, 3, 3, 4, 5, 6, 5]
arr.forEach { (x) in
    print(x)
}

8. 刪除和插入

array3.remove(at: 1)  //[1, 0, 8, 5, 6, 5]
array3.removeFirst()  //[0, 8, 5, 6, 5]
array3.removeLast()   //[0, 8, 5, 6]
array3.removeFirst(2) //[5,6]
array3.removeLast(1)  //[5]
array3.removeAll()    //[]

9. 獲取元素在數(shù)組中的索引

let arr = ["1", "2", "4", "3", "6", "2"]
//獲取最后一個(gè)元素索引
let index0 = arr.endIndex           //6

//獲取第一個(gè)元素索引
let index1 = arr.startIndex         //0

//獲取指定某元素索引
let index2 = arr.index(of: "3")     //3

//當(dāng)數(shù)組中有多個(gè)相同元素時(shí), 返回指定元素的第一個(gè)的索引
let index3 = arr.index(of: "2")     //1

//返回指定某索引的后一個(gè)索引, 等同于4+1
let index4 = arr.index(after: 4)    //5

//返回指定某索引的前一個(gè)索引, 等同于4-1
let index5 = arr.index(before: 8)   //7

//根據(jù)元素內(nèi)的某屬性獲取索引
let strArr = [("a", "1"), ("b", "2"), ("s", "3")]
let index = strArr.index(where: { $0.0 == "b" })
//返回值是一個(gè)可選值: Optional(1)

Dictionary and Set

  • 至于Collection類型阶祭,Set和Dictionary并不那么最直觀的
  • Swift 的 Dictionary橋接到了基礎(chǔ)框架的 NSDictionary類。

1.首先列表可以是從一系列鍵值對(duì)(元組)創(chuàng)建一個(gè)字典:

//Dictionary
let keyNames = ["a", "b", "c", "d", "e"]
let valueNames = [1, 2, 4, 5, 6]

//public init<S>(uniqueKeysWithValues keysAndValues: S) where S : Sequence, S.Element == (Key, Value)
//對(duì)于該方法的具體解釋,可以點(diǎn)進(jìn)去看一下官方的講解
let nameDic = Dictionary(uniqueKeysWithValues: zip(keyNames, valueNames))
print(nameDic)
//["b": 2, "e": 6, "a": 1, "d": 5, "c": 4]

2.在初始化Dictionary時(shí), 你現(xiàn)在可以使用你喜歡的方式來(lái)處理重復(fù)的鍵,同時(shí)避免覆蓋鍵值對(duì)直秆,且不會(huì)出現(xiàn)任何問(wèn)題:

let keyNames2 = ["a", "b", "c", "a", "b"]

//public init<S>(_ keysAndValues: S, uniquingKeysWith combine: (Value, Value) throws -> Value) rethrows where S : Sequence, S.Element == (Key, Value)
//對(duì)于該方法的具體解釋,可以點(diǎn)進(jìn)去看一下官方的講解
let nameDic2 = Dictionary(zip(keyNames2, repeatElement(1, count: keyNames2.count)), uniquingKeysWith: +)
print(nameDic2)
//["b": 2, "a": 2, "c": 1]

3.Dictionary 和 Set現(xiàn)在都可以將結(jié)果 通過(guò)filter函數(shù) 過(guò)濾到原始類型的新對(duì)象中:

let nameDic3 = nameDic.filter({ $0.value < 5 })
print(nameDic3)
//["b": 2, "a": 1, "c": 4]

4.Dictionary為直接映射其值提供了一種非常有用的方法::

//將value值Int轉(zhuǎn)化為字符串
let nameDic4 = nameDic3.mapValues({ "\($0)" })
print(nameDic4)
//["b": "2", "a": "1", "c": "4"]

5.在Dictionary上訪問(wèn)某個(gè)值時(shí)濒募,常見(jiàn)的做法是使用nil-coalescing operator給出默認(rèn)值

let nameDic5 = nameDic4["d", default : "unknown"]

6.我們可以從Sequence"中初始化Dictionary,并將其分組為bucket::

//注: 當(dāng)通過(guò)特定模式對(duì)數(shù)據(jù)進(jìn)行分組時(shí)圾结,這相當(dāng)方便瑰剃。
let name2 = ["Proxima", "Centauri A", "Centauri B", "Barnard", "Wolf"]
let nameDic6 = Dictionary(grouping: name2, by: { $0.first! })
print(nameDic6)
//["B": ["Barnard"], "W": ["Wolf"], "P": ["Proxima"], "C": ["Centauri A", "Centauri B"]]

涉及Zip的用法,詳見(jiàn)Swift語(yǔ)法之Zip詳解

7.預(yù)留空間

  • Sequence和Dictionary現(xiàn)在都具有明確保留容量的能力
  • 在這些類型上,Reallocation可能是一項(xiàng)代價(jià)高昂的任務(wù)筝野。
  • 如果你知道需要存儲(chǔ)的數(shù)據(jù)量時(shí), 使用reserveCapacity(_:)可以提高性能且便捷
var name3 : [String : Int] = [ : ]
print(name3.capacity) // 0
name3.reserveCapacity(10) //儲(chǔ)備 10元素的能力
print(name3.capacity) // 12


歡迎您掃一掃下面的微信公眾號(hào)晌姚,訂閱我的博客!

微信公眾號(hào)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歇竟,一起剝皮案震驚了整個(gè)濱河市挥唠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焕议,老刑警劉巖宝磨,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盅安,居然都是意外死亡唤锉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門宽堆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腌紧,“玉大人,你說(shuō)我怎么就攤上這事畜隶。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵籽慢,是天一觀的道長(zhǎng)浸遗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)箱亿,這世上最難降的妖魔是什么跛锌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮届惋,結(jié)果婚禮上髓帽,老公的妹妹穿的比我還像新娘。我一直安慰自己脑豹,他們只是感情好郑藏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘩欺,像睡著了一般必盖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俱饿,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天歌粥,我揣著相機(jī)與錄音,去河邊找鬼拍埠。 笑死失驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枣购。 我是一名探鬼主播嬉探,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坷虑!你這毒婦竟也來(lái)了甲馋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迄损,失蹤者是張志新(化名)和其女友劉穎定躏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芹敌,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痊远,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氏捞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碧聪。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖液茎,靈堂內(nèi)的尸體忽然破棺而出逞姿,到底是詐尸還是另有隱情辞嗡,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布滞造,位于F島的核電站续室,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谒养。R本人自食惡果不足惜挺狰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望买窟。 院中可真熱鬧丰泊,春花似錦、人聲如沸始绍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆虚。三九已至苛败,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間径簿,已是汗流浹背罢屈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篇亭,地道東北人缠捌。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像译蒂,于是被迫代替她去往敵國(guó)和親曼月。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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