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风格的集合类型
网友评论