Swift提供了3种基本的集合类型:
-
Arrays
:有序数据的集; -
Sets
:无序无重复数据的集; -
Dictionaries
:无序键值对的集。
以上类型都被实现为泛型集合。
集合的可变性
以上类型分配为变量,这个集合就是可变的。我们可以添加或者移除存在的数据项。如果分配成常量,那就是不可变的,大小和内容都不可以改变。
数组(Arrays)
数组使用有序列表存储同一类型多个值。相同的值可以多次出现在同一数组的不同位置中。
数组的定义
数组的定义包含两种方式:
-
Array[Element]
定义; -
[Element]
定义。
本文推荐使用第二种方式定义,以下是一个整数数组的定义:
var someInts = [Int]()
如果说代码上下文提供了类型信息,例如函数参数或者已经定义好了类型的变量或者常量,我们可以直接使用[]
创建空数组:
someInts.append(3)
someInts = []
创建一个带默认值的数组
可以使用repeating
参数传入初始值,count
参数传入数组大小:
var threeDoubles = Array(repeating: 0.0, count: 3)
//这是一个[Double]数组,等价于[0.0, 0.0, 0.0]
在数组中使用+
两个相同类型的数组使用+
会直接连接起来,得到新数组类型会直接推断出来,不需要声明。
用数组字面量构造数组
数组的字面量是一系列由逗号分隔并由方括号包裹着的值:[value1, value2, value3]
。
访问和修改数组
-
count
:获取数组元素的数量; -
isEmpty
:判断count
是否为0的缩写形式; -
append(_:)
:在数组后添加新的数据项; -
+=
:可以直接合并两个数组; -
[index]
:数组由下标直接访问,从0开始计数,也可以改变已有索引值的值。也可以使用一个范围改变数组内数组,即使新数据和原有数据个数不一样(直接顶替); -
insert(_:at:)
:在某个索引值之前加入数据; -
remove(at:)
:移除这个索引值的数据并返回这个数据; -
removeLast()
:直接移除数组最后一项,避免索引。
数组的遍历
可以使用for-in
直接遍历数组。如果需要每一个数据项以及索引值,那么可以使用enumerated()
方法(这是一个属性)。会返回一个由索引值和数据值构成的元组。
集合(Sets)
**集合(Sets)**存储相同类型并且没有确定顺序的值。当元素顺序不重要并且每个元素只出现一次使用集合而不是数组。
集合类型的哈希值
存储在集合类型的值必须书可哈希化的。必须可以提供一个方法计算他的哈希值。哈希值为Int
类型,相等类型哈希值相同:如果a==b
那么a.hashValue==b.hashValue
。
Swift所有的基本类型都是可哈希化的。
集合类型语法
集合的生命方式是Set<Element>
。集合没有对应的简化形式。
使用构造器构造一个空集合的方式是:
var letters = Set<Character>()
如果可以通过上下文推断集合类型,那么可以直接使用[]
声明一个空集合类型。
使用数组字面量创建集合
数组字面量可以创建集合,当声明为集合类型时,可以直接使用数组字面量赋初值。Set
类型不能够直接推断出来,必须显式的声明类型。
访问和修改一个集合
-
count
:获取集合元素的数量; -
isEmpty
:判断count
是否为0的缩写形式; -
insert(_:)
:在集合中添加新的数据项; -
remove(_:)
:删除集合中一个元素,如果包含这个元素就返回这个元素,如果不包含就返回nil
; -
removeAll(_:)
:删除集合中所有元素; -
contains(_:)
:检查集合中是否包含这个值。
遍历一个集合
可以使用for-in
进行遍历。但是集合没有顺序,如果要按照顺序访问,需要使用sorted()
方法返回一个有序数组,这个数组的顺序是按照<
的比较顺序。
集合操作
集合可以实现基本的集合操作。
-
intersection(_:)
:计算两个集合的交集; -
symmetricDifference(_:)
:计算两个集合的对等茶分集; -
union(_:)
:计算两个集合的并集; -
subtracting(_:)
:计算两个集合的差集。
集合成员的关系和相等
-
==
:两个集合的元素是否元素完全相等; -
isSubset(of:)
:判断一个集合是否是另一个集合的子集; -
isSuperset(of:)
:判断一个集合是否是另一个集合的父集; -
isStrictSubset(of:)
:判断一个集合是否是另一个集合的严格子集(两个集合不可以相等); -
isStrictSuperset(of:)
:判断一个集合是否是另一个集合的严格父集(两个集合不可以相等); -
isDisjoint(with:)
:判断两个集合是否不含有相同的值(是否没有交集)。
字典(Dictionaries)
**字典(Dictionaries)**是一个存储多个相同类型值的容器。每一个值(value)都有对应的键值(key)。我们通过键值访问对应的数据。
字典类型创建
字典类型有两种创建方法:
- 使用
Dictionary<Key, Value>
; - 使用
[Key: Value]
。
本文主要使用第二种方式。如果上下文可以推断出字典的类型,可以直接使用[:]
创建一个空字典。
字典类型的字面量
字典类型字面量是由一对一对被逗号分隔,被方括号包裹的键值对。键值对是由键值(key)和数据(value)组成的,[key1: value1, key2: value2, key3: value3]
。字典类型可以进行推断。
访问和修改字典
-
count
:获取字典元素的数量; -
isEmpty
:判断count
是否为0的缩写形式; -
[key]
:下标访问获得对应的数值,也可以进行修改,如果不存在对应值,那么返回nil
,字典返回的是一个可选值,需要解包使用。如果给一个键赋值为nil
,那么这个键对应的值将会删除; -
updateValue(_:forKey:)
:更新键值对应的数据,如果这个值不存在,会加入新值或者更新原有值并返回旧值。返回类型是可选类型,如果不存在旧值,那么返回nil
; -
removeValue(forKey:)
:移除对应键值和数据,如果不存在旧值,返回nil
,否则返回旧值。
字典的遍历
可以使用for-in
遍历字典,返回值是元组,包含键值和数据。可以使用keys
属性和values
属性获得字典的键值和数据。并且可以使用类型转换转换成数组类型。两个属性也可以使用sorted()
方法获得排序后的数组。