Swift系列4-集合

集合的可变性

如果你创建了一个数组,字典或者合集,并且赋值给一个变量,那么它就是可变的集合,可以添加,移除,修改它的元素来改变集合;
如果赋值给一个常量,那么它就是不可变的;

数组

数组:关键字Array 有序的方式来存储相同类型的值,多个相同的值可以在数组不同的地方出现;
通过下标来访问数组里面的元素,下标从0开始.

1
2
3
let arr1:Array = Array.init(arrayLiteral: "1","2","3");print(arr1)//初始化一个不可变数组
var arr2:Array = [String]()//可变数组
arr2.append("st1")

创建一个空数组

1
2
3
4
5
var intArr = [Int]()//创建一个类型为Int的数组
intArr.append(00)//给数组添加值
intArr.insert(11, at: 0) //插入数据到对应的下标
print(intArr[0]) //读取数组对应下标的值
intArr.removeAll();intArr = [];//这两种方式是等效的,都是移除数组内所有的元素

使用默认值来创建数组

1
let arr3 = Array.init(repeating: 99.0, count: 10);print(arr3)//创建Doubule类型数组,同一个数据10个

数组的合并组成一个新的数组:使用 + 号

1
let newArr = arr1 + arr2;print(newArr)

通过数组字面量来创建数组

数组的简写模式:中括号括起来,元素用(,)隔开

1
let myArr = [1,2,3,4,5,1];print(myArr)//整型数组

访问和修改数组

通过下标的形式,下标从0开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var allArr = ["game","day","month","year","computer","ture","lie"]
let count = allArr.count;print(count)//数组个数

if allArr.isEmpty {
//判断数组元素个数是否为0
}

allArr.append("tea")//在数组末尾增加一个元素
allArr += ["book"]// += 在数组末尾增加一个元素,或者多个
let tea = allArr[7];print(tea)//获取某个下标的值
allArr[0] = "not game"//通过下标来修改某个值
allArr[1...3] = ["phone","milk"]//可以替换范围内的值,就算待替换的和替换的值个数不一致
allArr.insert("desk", at: 0)//通过下标来插入一个元素
allArr.remove(at: 0)//通过下标来移除一个元素
allArr.removeLast() // 移除最后一个元素
allArr.removeFirst() // 移除第一个元素
allArr.removeAll() //移除所有元素

遍历数组

1
2
3
4
5
6
7
8
9
//只遍历数组的元素
let traverseArr = [1,2,3,4,5,6,7,8,9,0]
for i in traverseArr {
print("i = \(i)")
}
//遍历元素和对应的下标:enumerated()
for (index,item) in traverseArr.enumerated() {
print("第 \(index) 个元素是 \(item)")//第一个是下标,第二个是对应的值
}

字典

关键字Dictionary,字典存储无序的相互关联的同一类型的键和同一类型的值的集合,你需要通过键来获取对应的值,键不能相同,值可以相同;

创建一个空字典

1
2
var newDic:Dictionary = [Int:Int]()
newDic[11] = 22 //添加值,key = 11,value = 22

声明一个字典,并标明类型

标明该字典键和值的类型

1
var myDic:Dictionary<String,String>?

字典简写[Key:Value]

1
let dic = ["user":54212,"pwd":123456];print(dic)

访问和修改可变字典

1
2
3
4
5
6
7
8
9
10
11
12
var timeDic = ["year":"2021年","month":"3月","day":"11号"]
let dicCount = timeDic.count;print(dicCount)//读取字典有多少对元素
if timeDic.isEmpty {
//检查字典是否为空
}
timeDic["min"] = "06"//使用正确新键类型,来添加新的元素

//更新某个值:key存在时,返回旧值(检验是否更新成功);key不存在时,新添加一组数据,返回nil;所以这个方法返回的值是一个可选项
timeDic.updateValue("18", forKey: "min")
if let oldValue = timeDic.updateValue("21", forKey: "min"){
print(oldValue)
}

移除键值对

1
2
3
4
//移除某个键值对
timeDic["min"] = nil//通过赋值nil来移除某个值
//移除某个键值对,存在时返回旧值,不存在时返回nil
timeDic.removeValue(forKey: "day")

遍历字典

1
2
3
for (key,value) in timeDic {
print("\(key) : \(value)")
}

合集

合集:关键字Set,是一个无序的不会有重复元素的集合;

创建一个空的合集

创建一个空的合集时,需要标明Set关键字

1
2
var newSet:Set = Set<String>()
newSet.insert("90")

使用字面量创建合集

1
let mySet:Set = ["1","2","3","4"];print(mySet)

访问和修改合集

1
2
3
4
5
newSet.insert("91")//插入一个元素
print("合集元素个数:\(newSet.count)")//合集元素个数
if newSet.isEmpty {
//判断合集是否为空
}

移除一个值

移除一个值,如果存在则返回移除的值;不存在则返回nil

1
let removeValue = newSet.remove("1");print(removeValue as Any)

判断是否包含某个值

1
2
3
if newSet.contains("2") {
print("合集包含字符串 2")
}

遍历合集

1
2
3
for item in mySet {
print("every item : \(item)")
}

执行合集操作

1
2
3
4
5
6
7
let set1:Set = ["1","2","3","4","5"]
let set2:Set = ["6","7","8","4","5"]

print(set1.intersection(set2))//创建一个新的合集包含2个合集的共有值;["4","5"]
print(set1.symmetricDifference(set2))//创建新合集,set1和set2都包含但是不是共有的值;["1","2","3","6","7","8"]
print(set1.union(set2))//新合集,包含set1和set2;["1","2","3","4","5","6","7","8"]
print(set1.subtracting(set2))//新合集,set1不包含set2中共有的部分;["1","2","3"]

合集成员关系和相等性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//判断它们是否相等
if set1 == set2 {

}
//判断set1所有值是否被set2包含
if set1.isSubset(of: set2) {

}
//判断set1是否包含set2所有值
if set1.isSuperset(of: set2) {

}
//判断set1和set2是否拥有完全不同的值
if set1.isDisjoint(with: set2) {

}
//判断set1是否是set2的子集或者超集,但并不相等
if set1.isStrictSubset(of: set2) {

}
if set1.isStrictSuperset(of: set2) {

}

The end