Swift--Set 详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift--Set 详解相关的知识,希望对你有一定的参考价值。
参考技术A Set和Array的区别在于,Set是无序的,且Set中不能存在重复的元素(可以快速地验证Set中是否存在某一元素),此外Set中的元素需是符合Hashable协议的类型(字符串类型,数值类型,布尔类型,没有关联值的枚举类型,Set类型等都是符合Hashable的类型)。利用数组字面值可直接创建Set
.contains(_:) 查看Set中是否含有某一特定元素
== 判断两个Set所包含的元素是否都相等
.isSubset(of:) 判断当前Set是否是参数中的Set的子集
.isStrictSubset(of:) 判断当前Set是否是参数中的Set的真子集
.isSuperset(of:) 判断当前Set是否含有参数中的Set或序列的所有元素
.isDisjoint(with:) 判断当前Set和参数中的Set是否含有相同的元素,若没有返回true,否则返回false
.union(_:) 返回两个Set的并集
.intersection(_:) 返回两个Set的交集
.symmetricDifference(_:) 返回两个Set中除了交集元素外的所有元素的集合
.subtracting(_:) 返回两个集合的差集
.formUnion(_:) | .formIntersection(_:) | formSymmetricDifference(_:) | .subtract(_:) 这四个函数的功能与上述四个函数的功能类似,差别在于是上方的函数都返回一个新的Set而不改变当前的Set的值,而下方的四个函数将所得到的结果赋予当前的Set。
Set的相关操作既可以用于Set之间,也可以用于Set和Array,Set和Sequence(序列)之间的操作
任何集合或序列中的immutating操作(不改变Set的值)都可用于Set
使用for-in遍历Set中的元素(遍历顺序不确定)
很多序列或集合中的操作的返回值类型是Array或无类型的集合而不是Set,需要显式地将运算结果转化成Set
使用类型转换操作符 as 可完成Set和NSSet之间的桥接
为了完成Set到NSSet的桥接,要求Set中的元素必须是class类型,符合@objc protocol的类型或者可以与Foundation中的类型相桥接的类型(String, Int,Float等)
Set到NSSet的桥接的时间复杂度和空间复杂度总是O(1), 但当Set中的元素不是class类型也不是符合@objc protocol的类型时,Set中的元素到OC中相关类型的桥接总是发生在第一次访问Set中的元素时,时间复杂度为O(n)。
NSSet到Set的桥接会调用NSSet的copy(with:)方法得到NSSet的不可修改的副本(时间复杂度不确定)并进行额外的Swift的统计工作(时间复杂度为O(1)),如果NSSet已经是不可修改的,那么copy(with:)方法返回同一个set(时间复杂度为O(1)),并且与桥接后得到的Set共享同一存储空间,采用copy-on-write的方法对该内存存储进行优化。
苹果官方文档
以上是关于Swift--Set 详解的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2:“Set<UITouch>”类型的值没有成员“anyObject”[重复]
搜索引擎系列六:Lucene搜索详解(Lucene搜索流程详解搜索核心API详解基本查询详解QueryParser详解)