Swift 语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用来存储集合数据。数组是有序数据的集。集合是无序无重复数据的集。字典是无序的键值对的集。swift官方开发文档中的这张图十分清晰的描述了3种集合类型的区别。
集合的可变性
在上一篇文章,介绍字符串的时候,就说过字符串的可变性,这里集合的可变性和字符串类似。创建一个集合并把它分配给一个变量,这个结合就是可变的。相反,分配成一个常量,就是不可变的。
数组
Swift 的
Array类型被桥接到 Foundation 中的NSArray类。
定义有初始值的数组
var a = [1,2,3,4]
print(a)
var b:[String] = ["hello", "hai"]
var c:Array<Double> = [1.0,3.4,5.9]
print(c)
数组a,由于 Swift 的类型推断机制,当用字面量构造拥有相同类型值数组的时候,不一定需要显示的指定类型,如果数组在声明时设置了初始值,则编译器会根据赋值类型自动推断出数组的类型。
定义空数组
var array:Array<Int> = []
var array1 = [Int]()
var array2: [Int] = []
其他定义方式
var array3 = Array(repeating: -1, count: 3)//初始值为-1 长度为3
let array4 = [4,5,6]//不能修改
数组操作
可以使用数组的只读属性 count 来获取数组中的数据项数量:
var shoppingList = ["Eggs", "Milk"]
print("The shopping list contains \(shoppingList.count) items.")
使用布尔属性 isEmpty 作为一个缩写形式去检查 count 属性是否为 0:
if shoppingList.isEmpty {
print("The shopping list is empty.")
} else {
print("The shopping list is not empty.")
}
// 打印“The shopping list is not empty.”(shoppinglist 不是空的)
增删改查
//合并
array = array + [2,6]
print(array)
//追加元素
array.append(4)
//用下标来改变某个有效索引值对应的数据值:
array[0] = 0
array.insert(999, at: 0)
array.remove(at: 0)
是否包含某个元素
array.contains(2)
替换
array.replaceSubrange((1..<3), with:[3,4])
print(array)
排序
var sortArr = ["a","b","c","d","e","f"]
sortArr.sort { (s1, s2) -> Bool in
if s1 > s2 {
return true
} else {
return false
}
}
print(sortArr)
过滤
var filterArr = sortArr.filter { (item) -> Bool in
if item != "d" {
return true
} else {
return false
}
}
print(filterArr)
比较
if array1 == array3 {
print("equal")
}
遍历
for item in array3 {
print(item)
}
for item in array1[1...2] {
print(item)
}
for index in 0..<array.count {
print(array[index])
}
//反向
for index in (0..<array.count).reversed() {
print(array[index])
}
//遍历数组中所有值
for index in array[0...] {
print(array[index])
}
set集合
集合是同类型数据的集合:无序,无索引,同值元素只保留一个。
定义
var a:Set = [1,3,5,6,7,9]
print(a)
var b:Set<String> = ["a","c","f","r","o"]
print(b)
var c:Set<Int> = []
print(a.count)//长度
操作 增删改查
由于set并不关注其中元素的顺序,因此通过下标的方式来取值对set并无意义。需要注意,set的下标操作是不可逆的操作,只能向后移动,不能向前移动。
a.update(with: 1)
a.insert(99)
a.contains(9)//返回bool
var removeIndex = a.index(after: a.startIndex)
a.remove(at: removeIndex)
a.remove(3)
合并等其他操作
//合并两个set 返回新的set
var new_set = a.union(c)
//两个set中相同数据
var new_set1 = a.intersection(c)
//两个set中不同数据
var new_set2 = a.symmetricDifference(c)
//返回前面set与后面set中不同的数据
var new_set3 = a.subtracting(c)
比较
//相等
if a == c {
print("equal")
}
var scores1:Set = [11, 4, 3, 0, 5,8]
var scores2:Set = [4, 3, 5]
let b3 = scores1.isSubset(of: scores2) // 1是否为2的子集 b3 is false
let b4 = scores1.isSuperset(of: scores2) // 1是否为2的父集 b4 is true
let b5 = scores1.isStrictSubset(of: scores2) // 1是否为2的子集并不相等 b5 is false
let b6 = scores1.isStrictSuperset(of: scores2) // 1是否为2的父集并不相等 b6 is true
let b7 = scores1.isDisjoint(with: scores2) // 是否没有交集 b7 is false
过滤
var filter_set = a.filter { (item) -> Bool in
if item != 6 {
return true
} else {
return false
}
}
遍历
for item in a {
print(item)//每次打印顺序都不一样
}
Dictionary
定义
var a:Dictionary<String,String> = ["a":"A","b":"B","c":"C"]
print(a)
var b:[Int:String] = [1:"a",2:"b",3:"c"]
print(b)
var c = ["hello":"hai"]
var d = [Int:String]()
print(a["a"] ?? "unknow")
操作
a["a"] = "AA"
a.updateValue("aaa", forKey: "a")
print(a)
//没有key 就会把key-value 添加到dictionary中
a.updateValue("d", forKey: "d")
a.removeValue(forKey: "a")
//通过键来获取字典中的值时,也会返回一个optional类型的值,若键不存在则是nil,所以可以使用if-let来保证程序安全性
if let value = a["b"] {
print(value)
}
过滤
var new_dic = a.filter { (key,value) -> Bool in
if key == "a" {
return false
} else {
return true
}
}
遍历
//使用元组可以同时把key value遍历出来
for (key,value) in a {
print(key,value)
}