从零开始的8-bit迷宫探险【Level 4】Swift 基础语法 (二)

今日目标

  • 认识完变数、常数、型态之後,接着来认识将资料做集合处理的型别:
    • 阵列 (Array)
    • 字典 (Dictionary)
    • 集合 (Set)
  • 将针对不同型别,介绍几种较常使用的操作

阵列 (Array)

阵列是有序列的集合,集合内的元素必须是同一种类型的。

  • 宣告阵列的方法:可以在宣告时加上型态,也可以让 swift 自己侦测型态
var arrayNumber = [1, 2, 5, 10]
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
  • 修改阵列中的元素
    附注:阵列第一个元素的 index 是从 0 开始
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
arrayString[2] = "MoMo"
print(arrayString)
印出结果:
["Kevin", "Yoyo", "MoMo", "Sam"]
  • 加入新元素,使用 append
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
arrayString.append("MoMo")
print(arrayString)
印出结果:
["Kevin", "Yoyo", "Stan", "Sam", "MoMo"]
  • 移除元素,使用 remove
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
arrayString.remove(at: 1)
print(arrayString)
印出结果:
["Kevin", "Stan", "Sam"]
  • 计算阵列的长度,使用 count
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
print(arrayString.count)
印出结果:
4
  • 遍历阵列中的元素

1. 使用 forEach

var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
arrayString.forEach { item in
    print(item)
}
印出结果:
Kevin
Yoyo
Stan
Sam

2. 使用 for-in

var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
for item in arrayString {
    print(item)
}
印出结果:
Kevin
Yoyo
Stan
Sam

如果想取得该元素在阵列中的 index,可以使用 enumerated(),它会回传 index 及该元素的序列资料。
我们分别在 forEach 及 for-in 中使用 enumerated():

var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
arrayString.enumerated().forEach { index, item in
    print("[forEach] \(index): \(item)")
}
for (index, item) in arrayString.enumerated() {
    print("[for loop] \(index): \(item)")
}
印出结果:
[forEach] 0: Kevin
[forEach] 1: Yoyo
[forEach] 2: Stan
[forEach] 3: Sam
[for loop] 0: Kevin
[for loop] 1: Yoyo
[for loop] 2: Stan
[for loop] 3: Sam
  • 阵列的排序

1. sort()

  • 直接使用 sort(),会由小到大排序:
var arrayNumber = [1, 2, 5, 10, 3, 9]
arrayNumber.sort()
print(arrayNumber)
印出结果:
[1, 2, 3, 5, 9, 10]

2. 自订排序方式

  • 如果想自订排序的方式,可以用以下方式:
var arrayNumber = [1, 2, 5, 10, 3, 9]
arrayNumber.sort{ a, b in
    a > b
}
print(arrayNumber)
印出结果:
[10, 9, 5, 3, 2, 1]
  • 此外,swift 提供了更简便的写法:$0$1分别代表第一个参数及第二个参数,我们用以下写法可以达到同样的效果:
var arrayNumber = [1, 2, 5, 10, 3, 9]
arrayNumber.sort{ $0 > $1 }
print(arrayNumber)
印出结果:
[10, 9, 5, 3, 2, 1]
  • 使用 sort(by:)
    可以直接带入 >< 符号排序,例如带入 >,可以由大到小排序:
var arrayNumber = [1, 2, 5, 10, 3, 9]
arrayNumber.sort(by: >)
print(arrayNumber)
印出结果:
[10, 9, 5, 3, 2, 1]
  • 随机取得阵列中的元素:randomElement()
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
print(arrayString.randomElement())
印出结果:
Optional("Yoyo")

由於 randomElement() 回传的资料型态是 Optional,如果想强制取值,可以加上!
关於 Optional 会在之後详细介绍。

var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
print(arrayString.randomElement()!)
印出结果:
Yoyo
  • 过滤阵列中的元素:filter
    例如过滤出大於等於 5 的数字:
var arrayNumber = [1, 2, 5, 10, 3, 9]
print(arrayNumber.filter{$0 >= 5})
印出结果:
[5, 10, 9]
  • 阵列元素的Mapping:map
    将阵列中的元素,依序依照给定的方式做处理
    例如将每个元素都加上额外的字串:
var arrayString: [String] = ["Kevin", "Yoyo", "Stan", "Sam"]
print(arrayString.map{"My name is \($0)"})
印出结果:
["My name is Kevin", "My name is Yoyo", "My name is Stan", "My name is Sam"]

字典 (Dictionary)

字典的内容是 key-value 的集合,可以透过 key来取得对应的值。

  • 宣告字典的方法:可以在宣告时加上型态,也可以让 swift 自己侦测型态
    例如:[Int : String],代表 key 的型态为 Int,值的型态为 String。
var dicNumber = ["good": 80, "excellent": 95, "pass": 60]
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
  • 修改字典中的值
    透过 key 来改变对应的值
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
dicString["age"] = "10"
print(dicString)
印出结果:
["name": "Yoyo", "age": "10", "hobby": "hiking"]
  • 加入新元素
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
dicString["gender"] = "female"
print(dicString)
印出结果:
["hobby": "hiking", "age": "18", "name": "Yoyo", "gender": "female"]
  • 移除元素,使用 removeValue
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
dicString.removeValue(forKey: "age")
print(dicString)
印出结果:
["name": "Yoyo", "hobby": "hiking"]
  • 计算字典的长度,使用 count
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
print(dicString.count)
印出结果:
3
  • 遍历阵列中的元素

1. 使用 forEach
可以使用 .key.value 来分别取得 key 及值

var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
dicString.forEach { item in
    print(item)
    print(item.key)
    print(item.value)
}
印出结果:
(key: "name", value: "Yoyo")
name
Yoyo
(key: "age", value: "18")
age
18
(key: "hobby", value: "hiking")
hobby
hiking

2. 使用 for-in

var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
for item in dicString {
    print(item)
    print(item.key)
    print(item.value)
}
印出结果:
(key: "name", value: "Yoyo")
name
Yoyo
(key: "age", value: "18")
age
18
(key: "hobby", value: "hiking")
hobby
hiking
  • 随机取得字典中的元素:randomElement()
var dicString: [String : String] = ["name": "Yoyo", "age": "18", "hobby": "hiking"]
print(dicString.randomElement())
print(dicString.randomElement()!)
印出结果:
Optional((key: "age", value: "18"))
(key: "age", value: "18")
  • 过滤字典中的元素:filter
    例如过滤出值大於等於 80 的元素:
var dicNumber = ["good": 80, "excellent": 95, "pass": 60]
print(dicNumber.filter{$0.value >= 80})
印出结果:
["excellent": 95, "good": 80]
  • 字典元素的Mapping:mapValues
    将字典中的元素,依照给定的方式做处理
    例如将每个元素的值都加 5:
var dicNumber = ["good": 80, "excellent": 95, "pass": 60]
print(dicNumber.mapValues{$0 + 5})
印出结果:
["good": 85, "excellent": 100, "pass": 65]

集合 (Set)

Set 是没有序列的集合,包含的值都是不重复的

  • 宣告集合的方法:可以在宣告时加上型态,也可以让 swift 自己侦测型态
var setNumber: Set = [0, 2, 5, 3]
var setString: Set<String> = ["orange", "yellow", "black"]
  • 加入新元素,使用 insert
var setString: Set<String> = ["orange", "yellow", "black"]
setString.insert("white")
print(setString)
印出结果:
["white", "orange", "yellow", "black"]
  • 移除元素,使用 remove
var setString: Set<String> = ["orange", "yellow", "black"]
setString.remove("orange")
print(setString)
印出结果:
["yellow", "black"]
  • 计算集合的长度,使用 count
var setString: Set<String> = ["orange", "yellow", "black"]
print(setString.count)
印出结果:
3
  • 遍历集合中的元素

1. 使用 forEach

var setString: Set<String> = ["orange", "yellow", "black"]
setString.forEach { item in
    print(item)
}
印出结果:
orange
yellow
black

2. 使用 for-in

var setString: Set<String> = ["orange", "yellow", "black"]
for item in setString {
    print(item)
}
印出结果:
orange
yellow
black
  • 随机取得集合中的元素:randomElement()
var setString: Set<String> = ["orange", "yellow", "black"]
print(setString.randomElement())
print(setString.randomElement()!)
印出结果:
Optional("black")
black
  • 过滤集合中的元素:filter
    例如过滤出值大於 2 的元素:
var setNumber: Set = [0, 2, 5, 3]
print(setNumber.filter{$0 > 2})
印出结果:
[3, 5]
  • 集合元素的Mapping:map
    将集合中的元素,依照给定的方式做处理
    例如将每个元素的值都乘以 10:
var setNumber: Set = [0, 2, 5, 3]
print(setNumber.map{$0 * 10})
印出结果:
[0, 20, 50, 30]
  • 集合中是否包含某项目:contains
var setString: Set<String> = ["orange", "yellow", "black"]
print(setString.contains("yellow"))
print(setString.contains("red"))
印出结果:
true
false
  • Set 可以做数学的集合运算:
  1. 取得不同集合的交集:intersection
var setString: Set<String> = ["orange", "yellow", "black"]
var setString2: Set<String> = ["red", "yellow", "white"]
print(setString.intersection(setString2))
印出结果:
["yellow"]
  1. 取得不同集合之间,不在对方集合中的元素:symmetricDifference
var setString: Set<String> = ["orange", "yellow", "black"]
var setString2: Set<String> = ["red", "yellow", "white"]
print(setString.symmetricDifference(setString2))
印出结果:
["red", "black", "orange", "white"]
  1. 取得不同集合之间的联集:union
var setString: Set<String> = ["orange", "yellow", "black"]
var setString2: Set<String> = ["red", "yellow", "white"]
print(setString.union(setString2))
印出结果:
["black", "orange", "yellow", "red", "white"]
  1. 取得不同集合之间的差集:subtracting
    例如:
    • 取得在 setString 中,且不包含在 setString2 中的值
    • 取得在 setString2 中,且不包含在 setString 中的值
var setString: Set<String> = ["orange", "yellow", "black"]
var setString2: Set<String> = ["red", "yellow", "white"]
print(setString.subtracting(setString2))
print(setString2.subtracting(setString))
印出结果:
["black", "orange"]
["red", "white"]

今日小结:
今天认识了不同种类的集合类型,我们可以善用他们不同的特性,选择适合的类型来使用。
如果需要处理的是有排序的资料,较适合使用阵列 (Array)。
如果要处理的资料不在乎排序,需要 key-value 配对资料,较适合使用字典 (Dictionary)。
若是要处理数学集合运算,则集合 (Set) 是个不错的选择。


参考来源:
Array
Dictionary
Set


<<:  Day 12 多张照片混合

>>:  网路设备:交换机

爬虫怎麽爬 从零开始的爬虫自学 DAY4 开发环境-3 Visual Studio Code 使用设定

前言 各位早安,书接上回我们安装好python跟Visual Studio Code,完成了开发环境...

[Day 17] 资料产品生命周期管理-辅助决策

如同前面所说,资料模型需要运用到实际环境中才会发挥价值 Initiation 延续之前模型的初始条件...

[Day 30] SQLite 下

delete delete(String table, String whereClause, St...

[Day6] 多变量时间序列预测的鼻祖:向量自回归模型 (VAR)

第六篇我们要对之前提过的 AR model (AutoRegressive model) 做一个延伸...

Day01 - 系列文介绍、规划

前言 大家好,我是 Leo,这是我第一次参加 IT 铁人,心里满是期待。过去只有在 Medium (...