Swift提供了一系列强大的集合类型,包括数组、字典和集合。
数组
初始化
- 数组是一个有序的、固定大小的数据集合,其中每个元素都有一个相同的类型。Swift中的数组可以定义为以下形式:
1
var someArray = [Int]()
- 我们也可以使用初始值来创建一个已有元素的数组,例如:
1
var fruits: [String] = ["apple", "banana", "orange"]
- Swift 的 Array类型提供了初始化器来创建确定大小且元素都设定为相同默认值的数组。你可以传给初始化器对应类型的默认值(叫做
repeating
)和新数组元素的数量(叫做count
):
1
var threeDoubles = Array(repeating: 0.0, count: 3)
- 通过连接两个数组来创建数组
你可以通过把两个兼容类型的现存数组用加运算符( +)加在一起来创建一个新数组。新数组的类型将从你相加的数组里推断出来:
1
2
3
var doubles1 = Array(repeating: 0.2, count: 3)
var doubles2 = Array(repeating: 2.5, count: 3)
var doubles3 = doubles1 + doubles2
- 依托于 Swift 的类型推断,如果你用包含相同类型值的数组字面量初始化数组,就不需要写明数组的类型。 shoppingList的初始化可以写得更短:
1
var shoppingList = ["Eggs", "Milk"]
访问和修改元素
我们可以通过下标来访问数组元素,例如:
1
let firstFruit = fruits[0]
上述代码获取了数组中第一个元素”apple”。注意到我们使用的是let
关键字,这表示我们获取的是不可变的元素。如果我们想要修改某个元素,可以使用下标进行赋值操作,例如:
1
fruits[1] = "pear"
上述代码将数组中的第二个元素“banana”替换为了“pear”。
数组操作
Swift提供了多种方法来操作数组,如下所示:
isEmpty
:判断数组是否为空。count
:获取数组元素个数。append(_:)
:添加新元素到数组末尾。insert(_:at:)
:在指定位置插入新元素。remove(at:)
:移除指定位置的元素。removeLast()
:移除数组末尾的元素。removeAll()
:移除所有元素。
例如,我们可以使用以下代码获取数组长度并在末尾添加新元素:
1
2
let count = fruits.count
fruits.append("kiwi")
遍历一个数组
可以用 for-in循环来遍历整个数组中值的合集:
1
2
3
for item in fruits {
print(item)
}
如果你需要每个元素以及值的整数索引,使用 enumerated()
方法来遍历数组。 enumerated()
方法返回数组中每一个元素的元组,包含了这个元素的索引和值。你可以分解元组为临时的常量或者变量作为遍历的一部分:
1
2
3
for (index, value) in fruits.enumerated() {
print("Item \(index + 1): \(value)")
}
字典
初始化
字典是一种无序的键值对集合,其中每个键必须是唯一的。Swift中的字典可以定义为以下形式:
1
var someDictionary = [String: Int]()
以上代码创建了一个空的字符串键和整数值的字典。我们也可以使用初始值来创建一个已有元素的字典,例如:
1
var scores = ["Alice": 95, "Bob": 75, "Charlie": 85]
上述代码创建了一个键为字符串,值为整数的字典。注意到我们省略了字典类型的声明,Swift可以根据初始值自动推断出字典类型。
访问和修改键值对
我们可以通过键来访问字典中的值,例如:
1
let aliceScore = scores["Alice"]
上述代码获取了键为“Alice”的值95。注意到我们使用的是let
关键字,这表示我们获取的是不可变的值。如果我们想要修改某个值,可以使用键进行赋值操作,例如:
1
scores["Bob"] = 80
上述代码将键为“Bob”的值从75更改为80。
字典操作
Swift提供了多种方法来操作字典,如下所示:
isEmpty
:判断字典是否为空。count
:获取字典中键值对个数。updateValue(_:forKey:)
:更新指定键的值,或添加新键值对。removeValue(forKey:)
:移除指定键的键值对。removeAll()
:移除所有键值对。
例如,我们可以使用以下代码获取字典中键值对的个数并更新或添加键值对:
1
2
let count = scores.count
scores.updateValue(forKey: "David", defaultValue: 0)
上述代码获取了字典中键值对的个数并通过updateValue(_:forKey:)
方法将键为“David”的值更新为0或添加新键值对。
遍历字典
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//同时遍历key和value
for (name, score) in scores {
print("\(name): \(score)")
}
//只遍历key
for name in scores {
print("name key: \(name)")
}
//只遍历value
for score in scores {
print("\(score value): \(score)")
}
Swift 的 Dictionary类型是无序的。要以特定的顺序遍历字典的键或值,使用键或值的 sorted()方法。用字典接收字典中所有键或值:
1
2
let names = [String](scores.keys)
let scores = [String](scores.values)
集合
初始化
集合是一种无序的、唯一的元素集合。Swift中的集合可以定义为以下形式:
1
var someSet = Set<Int>()
以上代码创建了一个空的整数集合。我们也可以使用初始值来创建一个已有元素的集合,例如:
1
var primes: Set<Int> = [2, 3, 5, 7]
上述代码创建了一个包含四个质数的整数集合。注意到我们在定义变量时使用了:
符号来指定集合类型。
访问和修改元素
我们可以通过contains(_:)
方法来检查一个元素是否存在于集合中,例如:
1
let containsThree = primes.contains(3)
上述代码检查了整数3是否存在于集合中。如果我们想要添加或移除某个元素,可以使用insert(_:)
和remove(_:)
方法,例如:
1
2
primes.insert(11)
primes.remove(2)
上述代码将整数11添加到集合中,并移除了整数2。
集合操作
Swift提供了多种方法来操作集合,如下所示:
isEmpty
:判断集合是否为空。count
:获取集合中元素个数。union(_:)
:返回当前集合和指定集合的并集。intersection(_:)
:返回当前集合和指定集合的交集。subtracting(_:)
:返回当前集合相对于指定集合的补集。symmetricDifference(_:)
:返回当前集合和指定集合的对称差集。
1
2
3
4
5
6
7
8
9
10
11
12
let A: Set = [1, 3, 5, 7, 9]
let B: Set = [0, 2, 4, 6, 8]
let C: Set = [2, 3, 5, 7]
A.union(B).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A.intersection(B).sorted()
// []
A.subtracting(C).sorted()
// [1, 9]
A.symmetricDifference(C).sorted()
// [1, 2, 9]
合集成员关系和相等性
- 使用“相等”运算符 (
==
)来判断两个合集是否包含有相同的值; - 使用
isSubset(of:)
方法来确定一个合集的所有值是被某合集包含; - 使用
isSuperset(of:)
方法来确定一个合集是否包含某个合集的所有值; - 使用
isStrictSubset(of:)
或者isStrictSuperset(of:)
方法来确定是个合集是否为某一个合集的子集或者超集,但并不相等; - 使用
isDisjoint(with:)
方法来判断两个合集是否拥有完全不同的值。
1
2
3
4
5
6
7
8
9
10
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubset(of: farmAnimals)
// true
farmAnimals.isSuperset(of: houseAnimals)
// true
farmAnimals.isDisjoint(with: cityAnimals)
// true
遍历合集
你可以在 for-in循环里遍历合集的值。
1
2
3
for genre in favoriteGenres {
print("\(genre)")
}