Swift 语言提供Arrays
、Sets
和Dictionaries
三种基本的集合类型用来存储集合数据。数组(Arrays
)是有序数据的集。集合(Sets
)是无序无重复数据的集。字典(Dictionaries
)是无序的键值对的集
ps:Swift 的
Arrays
、Sets和Dictionaries
类型被实现为泛型集合
集合的可变性
如果创建一个Arrays
、Sets
或Dictionaries
并且把它分配成一个变量,这个集合将会是可变的。这意味着我们可以在创建之后添加更多或移除已存在的数据项,或者改变集合中的数据项。如果我们把Arrays
、Sets
或Dictionaries
分配成常量,那么它就是不可变的,它的大小和内容都不能被改变。
Array
var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.")
// 打印 "someInts is of type [Int] with 0 items."
如果我们同时需要每个数据项的值和索引值,可以使用enumerate()方法来进行数组遍历。enumerate()返回一个由每一个数据项索引值和数据值组成的元组。我们可以把这个元组分解成临时常量或者变量来进行遍历:
for (index, value) in shoppingList.enumerate() {
print("Item \(String(index + 1)): \(value)")
}
// Item 1: Six eggs
// Item 2: Milk
集合(Sets)
一个类型为了存储在集合中,该类型必须是可哈希化的--也就是说,该类型必须提供一个方法来计算它的哈希值。一个哈希值是Int类型的,相等的对象哈希值必须相同,比如a==b
,因此必须a.hashValue
== b.hashValue
。
Swift 的所有基本类型(比如String
,Int
,Double
和Bool
)默认都是可哈希化的,可以作为集合的值的类型或者字典的键的类型。没有关联值的枚举成员值默认也是可哈希化的。
ps: 你可以使用你自定义的类型作为集合的值的类型或者是字典的键的类型,但你需要使你的自定义类型符合 Swift 标准库中的
Hashable
协议。符合Hashable
协议的类型需要提供一个类型为Int的可读属性hashValue
。由类型的hashValue属性返回的值不需要在同一程序的不同执行周期或者不同程序之间保持相同。
因为
Hashable
协议符合Equatable
协议,所以符合该协议的类型也必须提供一个"是否相等"运算符(==
)的实现。这个Equatable
协议要求任何符合==
实现的实例间都是一种相等的关系。也就是说,对于a,b,c
三个值来说,==
的实现必须满足下面三种情况:
-
a == a
(自反性) -
a == b
意味着b == a
(对称性) -
a == b
&&b == c
意味着a == c
(传递性)
集合操作
- 使用
intersect(_:)
方法根据两个集合中都包含的值创建的一个新的集合。 - 使用
exclusiveOr(_:)
方法根据在一个集合中但不在两个集合中的值创建一个新的集合。 - 使用
union(_:)
方法根据两个集合的值创建一个新的集合。 - 使用
subtract(_:)
方法根据不在该集合中的值创建一个新的集合。
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sort()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersect(evenDigits).sort()
// []
oddDigits.subtract(singleDigitPrimeNumbers).sort()
// [1, 9]
oddDigits.exclusiveOr(singleDigitPrimeNumbers).sort()
// [1, 2, 9]
集合成员关系和相等
- 使用“是否相等”运算符(==)来判断两个集合是否包含全部相同的值。
- 使用isSubsetOf(_:)方法来判断一个集合中的值是否也被包含在另外一个集合中。
- 使用isSupersetOf(_:)方法来判断一个集合中包含另一个集合中所有的值。
- 使用isStrictSubsetOf(:)或者isStrictSupersetOf(:)方法来判断一个集合是否是另外一个集合的子集合或者父集合并且两个集合并不相等。
- 使用isDisjointWith(_:)方法来判断两个集合是否不含有相同的值。
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"]
houseAnimals.isSubsetOf(farmAnimals)
// true
farmAnimals.isSupersetOf(houseAnimals)
// true
farmAnimals.isDisjointWith(cityAnimals)
// true
字典(Dictionary)
ps: 一个字典的
Key
类型必须遵循Hashable
协议,就像Set
的值类型。
var namesOfIntegers = [Int: String]()
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
Swift 的字典类型是无序集合类型。为了以特定的顺序遍历字典的键或值,可以对字典的keys或values属性使用sort()方法。