Swift集合类型

作者: dongwenbo | 来源:发表于2017-01-10 16:24 被阅读29次

Swift有三种集合类型,包括

  • Array,有序可重复
  • Set,无序不可重复
  • Dictionary,无序不可重复(key)的键值对

集合中数据类型必须相同,集合支持泛型

集合的可变性

varlet决定。使用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)
访问和修改数组

使用方法,属性和下标对数组进操作
属性:countisEmpty
方法: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的所有基本类型(StringIntDoubleBool)都是可哈希的,没有关联值的枚举成员值默认也是可哈希的。
自定义的类型如果想要作为键值或者集合中的值,必须实现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,]
访问修改集合

属性:countisEmpty
方法: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]()
访问和修改

属性:countisEmpty
方法: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风格的集合类型

相关文章

  • iOS开发 - 「Swift 学习」Dictionary集合类型

    Swift语言Dictionary集合类型的创建、遍历 Swift 的字典类型是无序集合类型 Dictionary...

  • Swift -- 集合类型

    Swift 集合类型 Swift 语言提供Arrays、Sets和Dictionaries三种基本的集合类型用来存...

  • Swift语法--集合类型

    集合类型 提供三种集合,数组、合集、字典。Swift中的集合总是明确能储存的值的类型。 Swift中的集合是采用泛...

  • Swift4的翻译

    集合类型 Swift提供三种集合类型, 分别为arrays, sets, and dictionaries, 他们...

  • 8.集合类型(CollectionType)

    kotlin_集合类型 Array_数组 Set Map swift_集合类型 Array_数组

  • Swift3.x - 集合类型

    集合类型的介绍Swift中提供三种集合类型:数组(Arrays)、集合(Sets)和字典(Dictionaries...

  • Swift5.1集合类型

    4.集合类型 集合类型:Swift 语⾔提供数组(Array)、集合(Set)和字典(Dictionary)三种基...

  • 4、Swift集合类型

    集合类型 Swift 语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用...

  • Swift - 集合类型

    集合类型 Swift 语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用...

  • Swift:基础(十四)字典

    Swift 字典 Swift 字典用来存储无序的相同类型数据的集合,Swift 字典会强制检测元素的类型,如果类型...

网友评论

    本文标题:Swift集合类型

    本文链接:https://www.haomeiwen.com/subject/pvzcbttx.html