集合类型
引言:Swift 语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用来存储集合数据。数组是有序数据的集。集合是无序无重复数据的集。字典是无序的键值对的集。
数组
1.定义: 数组内可以存放
let list = [Int]() 代表是个容纳Int类型的空数组
let list:[Int] = [1,2,3] 代表是个只容纳Int类型的数组
let list = [1,2,3] 代表是个容纳Int类型的数组(系统会自动辨识容器内的类型)
let list = Array(repeating: 5, count: 3) 该方法适合创建重复数据的数组,代表存放3个Int为"5"的数组
2.方法
(1)获取数组内的元素
let reslut = list[0] 代表获取索引为0的数据
list.count //代表数组内所有元素的数量
(2)增加、删除、修改元素(仅限var定义的数组)
1. list.append(4) 代表增加一个数字为4的数据
2. list.append(contentsOf: [5,6]) 代表增加数字:5、6的数据,与OC中的addObjectsFromArray:意义一样
3. let listOne = [7,8]
list = list+listOne 代表两个数组合并
4. list.insert(0, at: 0) 代表在索引为0的地方插入数字0
5. list.insert(contentsOf: [5,6], at: 2) 代表在索引为2的地方插入数组[5,6]
6. list.remove(at: 0) 代表删除下标为0的元素
7. list.removeAll() 代表删除数组内所有元素
8. list.removeAll { (item) -> Bool in
item%2 == 0
}
代表数组内删除可被2整除的元素
9. list[1] = 12 代表list内索引为1的值修改为12
(3)获取元素的索引
1. let index = list.firstIndex(of: 5) 代表获得数字5最小的索引(正向查找)
2. let index = list.lastIndex(of: 5) 代表获得数字5最大的索引(反向查找)
注意:以上获取索引仅支持数组内的元素不是集合类型的,若是数组内都是集合类型,则需要用下面的方法进行查询:
let listOne = [[1,2],[3,4]]
let index = listOne.lastIndex { (arr) -> Bool in
arr.contains(2)
}后缀可跟!(代表必有值)或者后跟 ?? 0 (代表可能返回为空,默认赋值0)
(4)过滤数组
let array = list.filter { (item) -> Bool in
return item > 3
}
这是数组的过滤器,用的是一个尾随闭包,代表的是返回一个(过滤list中大于3的)数组
(5)数组遍历
1. for index in list {
print(index)
}
代表循环取出list的所有元素
2. for index in list.dropFirst() {
print(index)
}
代表循环取出list内除去首个元素的所有元素
for index in list.dropFirst(2) {
print(index)
}
代表循环取出list内除去前两个元素的所有元素
for index in list.dropLast() {
print(index)
}
代表循环取出list内除去末尾元素的元素
for index in list.dropLast(2) {
print(index)
}
代表循环取出list内除去最后两个元素的所有元素
3. for index in 0..<list.count {
print(index)
}
代表循环取出list的下标
4. for (index,result) in list.enumerated() {
print(index)//下标
print(result)//元素
}
代表循环取出list的所有下标和元素
(6)数组变形
1.map函数能够被数组调用,它接受一个闭包作为参数,作用于数组中的每个元素。闭包返回一个变换后的元素,接着将所有这些变换后的元素组成一个新的数组,如:
let listOne = list.map { (item) -> Int in
return item + 1
}
代表返回一个每一个下标对应的元素都比list内加一的数组
而且返回的数组的元素不仅仅局限于Int类型,可以是String,Bool等其他类型
2.flatMap与map的区别:
(1)flatMap对于数组内的元素可以"降维",比如
let array = [[1,2,3],[4,5,6]]
let listTwo = array.map { (item) -> [Int] in
item.map { (num) -> Int in
return num+1
}
}(map里的这一段函数为闭包函数,后面会将详细学习)
可简写:var listThree = array.flatMap{ $0.map{ $0 + 1 } },这里用到了闭包的捕获上下文、尾随闭包、参数缩写、隐式返回,但是学习初期不提倡,
输出为:[[2, 3, 4], [5, 6, 7]]
let listThree = array.flatMap { (item) -> [Int] in
item.map { (num) -> Int in
return num+1
}
}
可简写:var listThree = array.flatMap{ $0.map{ $0 + 1 } },但是学习初期不提倡
输出为:[2, 3, 4, 5, 6, 7]
(2) flatMap可对数组内的元素强制解包(过滤数组内为nil的元素),比如
let array:[String?] = ["A","B",nil,"CB"]
print(array)
输出:[Optional("A"), Optional("B"), nil, Optional("CB")]
let listTwo = array.flatMap {$0}
print(listTwo)
输出:["A", "B", "CB"]