Swift--Set 详解

概述:

Set和Array的区别在于,Set是无序的,且Set中不能存在重复的元素(可以快速地验证Set中是否存在某一元素),此外Set中的元素需是符合Hashable协议的类型(字符串类型,数值类型,布尔类型,没有关联值的枚举类型,Set类型等都是符合Hashable的类型)。

利用数组字面值可直接创建Set

创建Set


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(序列)之间的操作

Set与其他类型之间的操作


集合或序列中可用于Set的操作:

任何集合或序列中的immutating操作(不改变Set的值)都可用于Set

  集合或序列中可用于Set的操作

使用for-in遍历Set中的元素(遍历顺序不确定)

Set的遍历

很多序列或集合中的操作的返回值类型是Array或无类型的集合而不是Set,需要显式地将运算结果转化成Set

显式地将运算结果转化成Set


Set和NSSet之间的桥接:

使用类型转换操作符 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的方法对该内存存储进行优化。


参考文献:

苹果官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,799评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,916评论 2 9
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,046评论 0 4
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 4,134评论 0 2
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,947评论 0 5