Swift有三种集合类型,包括
-
Array,有序可重复 -
Set,无序不可重复 -
Dictionary,无序不可重复(key)的键值对
集合中数据类型必须相同,集合支持泛型
集合的可变性
由var,let决定。使用let,编译器会进行优化
数组(Arrays)
数组的数据结构为有序列表
数组的简单语法
创建数组的几种形式
let array1 = Array<Int>()
let array2 = [Int]()
let array3 = [Int](arrayLiteral: 1,2,3)
let array4 = [1,2,3]
在数组的类型被确定后,再次使用赋值语句时,swift可以自动推断类型
let array1 = []//一个类型为[Int]的空数组
带默认值的数组
let array1 = Array<Int>(repeating: 0, count: 3)
let array2 = [Int](repeating: 0, count: 3)
let array3 = Array(repeating: 0, count: 3)
等价于
[0,0,0]
通过两个数组相加创建一个数组
使用+来组合两种类型相同的数组。新数组类型自动推断
let array1 = [Int](arrayLiteral: 1,2,3)
let array2 = [1,2,3]
let array3 = array1 + array2
print(array3)
访问和修改数组
使用方法,属性和下标对数组进操作
属性:count,isEmpty
方法:append(_:),insert(_:at:),remove(at:)
下标:
var array = [1,2,3]
array[0] = 10
切片替换:
var array = [1,2,3,4,5,6,7,8]
array[1...3] = [10,10,10,10,10,10,10]
print(array)//[1, 10, 10, 10, 10, 10, 10, 10, 5, 6, 7, 8]
切片和新值的个数不必一致
remove(at:)和下标语法的返回值不是可选类型,这就是说,在越界或者空数组时,会发生运行时错误
数组遍历
使用for-in
var array = [1,2,3,4,5,6,7,8]
for value in array{
print(value)
}
for value in array.enumerated(){
print(value)//元组
}
集合
集合内数据类型相同,没有顺序,值唯一,集合中的值都是可哈希的
哈希值
对象相同,哈希值一定相同,哈希值是Int类型的。Swift的所有基本类型(String,Int,Double,Bool)都是可哈希的,没有关联值的枚举成员值默认也是可哈希的。
自定义的类型如果想要作为键值或者集合中的值,必须实现Hashable
集合的语法
var set = Set<Int>()
set的类型由于构造器语法Set<Int>被推断为Set<Int>
类型确定后,以后的赋值就不需要指明类型了
var set = Set<Int>()
set.insert(1)
print(set)
set = []//不需要指明类型
用数组字面量创建集合
数组字面量会被推断为数组,所以我们需要显式指明类型
var set:Set<Int> = [1,2,3,4,]//最后可以多一个`,`
Int类型可以被推断
简写为
var set:Set = [1,2,3,4,]
访问修改集合
属性:count,isEmpty
方法:insert(_:),remove(_:)
remove(_:)的返回值是可选类型,因为要删除的值在集合中找不到,这点和数组不同,如果硬要说是为了安全性,为什么数组会发生运行时错误呢🙃?
集合遍历
var set:Set = [4,2,1,7,10]
for value in set{
print(value)
}
for value in set.sorted(){
print(value)
}
集合是无序的,我们可以使用sorted()函数排序
既然是集合,肯定有并集,交集,子集,真子集等概念
集合基本操作
交集:intersection()
并集:union()
sysmmetricDifference():并集减交集
subtracting():并集减参数中的那个集合
不举例了
集合之间的关系
- 相等(
==),比较两个集合中的元素是否全部相同 -
isSubset(of:),是否子集 -
isSuperset(of:),是否超集 -
isStrictSubset(of:),是否真子集 -
isStrictSuperset(of:),是否真超集 -
isDisjoint(with:),是否不相交
不举例了
字典
键值对组成,键可哈希,不可重复
创建语法
var dict1 = Dictionary<Int,String>()
var dict2:Dictionary<Int,String> = [:]
var dict3 = [1:"1"]//字面量
var dict4 = [Int:String]()
访问和修改
属性:count,isEmpty
方法:updateValue(value,key),下标赋值,下标取值,removeValue(key),下标删除
下标赋值和updateValue(value,key)都是存在时,更新值,不存在时,插入值。需要特别注意的是,updateValue会返回一个可选类型的值,表示,值存在时返回旧值,值不存在时返回nil
下标取值返回可选类型表达值缺失,同样是下标取值,数组可没这待遇,😄
removeValue(key)和下标删除都可以删除元素,removeValue(key)会把删除的元素返回,类型为可选,表达值缺失,下标删除为dict[1]=nil的形式
字典遍历
var dict = [1:"1",2:"2",3:"3",4:"4",5:"5"]
for value in dict{
print(value)//一个个元组
}
for (a,b) in dict{
print("\(a) \(b)")//起个名字
}
for key in dict.keys{
print(key)//只遍历键
}
for value in dict.values{
print(value)//只遍历值
}
for key in dict.keys.sorted(){
print(key)//给键排序
}
使用键名或值构建数组
var array1 = [Int](dict.keys)
var array2 = [String](dict.values)
上述三种集合与OC中的三种集合都有桥接,但是会出现诡异的问题,建议使用swift风格的集合类型










网友评论