集合
什么是集合?
我们之前介绍了数据类型,每个数据类型中往往包含是单条数据。其实,多条数据也可以组合的形式出现。这种组合起来的数据,就叫做集合。
那么,有哪些组合的形式呢?
数据的组合形式
数据的组合形式有三种:数组Array
,集合Set
,字典Dictionary
。
- 数组:
var array = [1,2,3]
- 集合:
var set = [1,2,3]
- 字典:
var dictionary = ["numberA":1, "numberB":2, "numberC":3]
这里也有个集合,不是我们本节标题中说的那个
集合
。我们后面用数据组合
这样的描述性语言来避免混淆。
- 术语,英语叫做
jargon
,也叫黑话,通常是流行在特定的人群之间的简便用语。除了可以提高沟通效率,还能有效隔绝并分辨另外的群体。- 我们在学习编程的时候,会不断碰到各种术语。对老手来说,术语表达的意思更精确,沟通的效率也更高,但是对于新手,简直是噩梦。更糟糕的是,术语抬高了入门的门槛。
- 我争取把这些术语都翻译成白话。
观察这三种形式,都是用中括号,将多个数据包起来,中间用逗号连接。其中,字典稍微特殊些,每条数据中间是冒号,成对出现。
既然数据能组合,而且有三种形式,它们一定都有自己的特点。比如,如何进行创建,访问,操作。
创建组合
与创建常量和变量的方法类似,我们来创建一些组合。
-
创建数组
var someNumberA = [1,2,3]
如果我们打印someNumberA
的数据类型(print(type(of: someNumbersA))
),可以发现,类型为Array<Int>
,就是说,这是一个整型类型的数组。
那么,数据能混合吗?可以试一下:
var mixedValue = [1,2.2,"Hello"]
,报错。就是说数组中的数据类型必须一致。但是,这样的混合是接受的。var someNumbersB = [1.1,2,3]
, 这种数组的类型是Array<Double>
。其实Swift已经把里面的Int型隐式转换为Double型了。
我们还能用let
创建常量数组,这个很好理解,常量数组将不能更改,而变量数组可以。为了简便,我们后面默认使用var
创建变量数据组合。
Swift还提供了Array
构造数组的方法:var threeDoubles = Array(repeating: 1, count: 3) // [1,1,1]
。
这里,我们顺带可以看到数组的内的数据是可以重复的。 -
创建集合
你刚才可能有点疑惑,集合看起来跟数组不是一样的吗?其实,集合最大的特点就是集合内的数据是无序且非重复的。另外的两个数组的特性,放到集合身上也是一样的,集合中的数据类型必须一致,常量集合不能更改,而变量集合可以。其实,集合还有更多自身的独特特性,后面我们会介绍。
那么,既然形式几乎一样,我们如果创建一组集合呢?
var setValues: Set = [1,2,3]
其实在创建任何一个数据时,我们都可以加上冒号后面再跟上数据类型,但是在大部分情况下,Swift是可以推断出类型的,因此,我们建议的原则是,尽量不加,免得代码看起来啰嗦。在这里,我们被迫加了: Set
这样一个声明,因此,我们print(type(of: setValues))
打印的数据类型就是Set<Int>
,一个Int型的Set。 -
创建字典
字典里的数据是成对出现的,只要数据类型一致,我们可以这样做:
var intIntDict = [1:666,2:888,3:999]
var intStringDict = [1:"A",2:"B",3:"C"]
var stringStringDict = ["A":"sky","B":"river","C":"mountain"]
因为中括号中带有带冒号的成对数据,这种形式不需要显式声明,会自动被推断为字典类型。
我们总结一下如何创建一个组合的数据:
创建数组:var someNumberA = [1,2,3]
,创建集合:var setValues: Set = [1,2,3]
,创建字典:var intStringDict = [1:"A",2:"B",3:"C"]
。
组合的一些共有特性:
- 组合中的数据类型要一致;
- 常量组合不能修改,变量组合可以;
访问组合
创建出组合后,我们先看看如何访问它们。
- count计数
我们可以计算组合中包含数据的数量。
var arrayNumbers = [1,2,3,4] // 定义一个数组
var setValues: Set = [1,2,3] // 定义一个集合
var intStringDict = [1:"A",2:"B"] // 定义一个字典
// 他们都有count方法,用.count调用
arrayNumbers.count //4
setValues.count //3
intStringDict.count //2
- 遍历
使用for-in进行遍历,从而访问到组合中的每一个值,是一个普遍的操作。
- 遍历数组
var arrayNumbers = [1,2,3]
for i in arrayNumbers {
print(i)
}
// 1,2,3
- 遍历集合
这里就体现了集合与数组的不同,集合是无序的,因此在打印遍历的结果时,排列的顺序是随机的,你可以在Playground中试一下。
var setValues: Set = [1,2,3]
for i in setValues {
print(i)
}
// 每次运行,结果顺序会随机变化
- 遍历字典
字典有一对值,它们被称作keys: values
。如果调用.keys或.values,可以得到一组数组形式的数据。
var intStringDict = [1:"A",2:"B",3:"C"]
print(intStringDict.keys) // 1,3,2 一组无序的值
你可以单独遍历出key
,可以单独遍历出value
,也可以同时遍历出key: value
。
var intStringDict = [1:"A",2:"B",3:"C"]
// 遍历字典中的keys
for key in intStringDict.keys {
print(key)
}
// 遍历字典中的values
for value in intStringDict.values {
print(value)
}
// 同时遍历key和value
for (key,value) in intStringDict {
print(key, value)
}
字典也是无序的,多次运行,我们可以发现,它的遍历结果排列顺序也是随机的。
- 访问组合
- 数组
数组是有序的,有默认的下标。任何一个数组,从第一个数据开始数,数到最后一个数据。数的时候,要从零开始,每个数据分别对应着0,1,2,3...。因此,我们可以通过指定下标值,访问到想要访问的数据。
var arrayNumbers = [1,2,3,4,5]
arrayNumbers[0] // 1
arrayNumbers[2] // 3
// 还可以按范围读取
arrayNumbers[0...3] // [1, 2, 3, 4] 注意这里返回的是一个数组
- 字典
字典是无序的,没有下标,但是有key
,我们可以通过key访问value。
var stringStringDict = ["A":"sky","B":"river","C":"mountain"]
stringStringDict["A"] // "sky"
stringStringDict["C"] // "mountain"
- 集合
集合是无序的,没有下标,也没有Key,因此,无法访问具体的指定数据。
但是集合有自己特殊方法,比如排序,包含判断。
// 排序
setIntValues.sorted() // 返回了一个从小到大排序的有序数组
setStringValues.sorted() //同样返回一个有序数组
// 包含判断 contains
setIntValues.contains(1) // true
setStringValues.contains("D") // false
小结与预告
本节我们介绍了数据组合的三种形式:数组Array
,集合Set
,字典Dictionary
。
如何创建他们,如何访问他们等,讲到这里,内容已经有点多,我们暂且休息一下。
有疑惑的地方,你可以试着在playground上面多敲一些代码试试。
下节,我们继续介绍如何操作这些数据组合。
网友评论