淘宝客建立网站推广怎么做,怎样申请注册公司网站,长沙网站制作品牌,一键制作网站概述
初学 Swift 且头发茂密的小码农们在日常开发中必定会在数组#xff08;Array#xff09;和集合#xff08;Set#xff09;两种类型之间的选择中“摇摆不定”#xff0c;这也是人之常情。 Array 和 Set 在某些方面“亲如兄弟”#xff0c;但实际上它们之间却有着“云…
概述
初学 Swift 且头发茂密的小码农们在日常开发中必定会在数组Array和集合Set两种类型之间的选择中“摇摆不定”这也是人之常情。 Array 和 Set 在某些方面“亲如兄弟”但实际上它们之间却有着“云泥之别”。 在本篇博文中您将学到如下内容 概述1. Array 其人2. Set 其人3. 考量运行性能4. Array 和 Set 选择原则总结 相信学完本课后小伙伴们定能在开发中对如何选择 Array 和 Set 两种数据类型胸有成竹。
闲言少叙Let’s make a choice 1. Array 其人
Array 俗称数组它其实上就是一个遵守 Collection 协议的泛型结构。在 Swift 中我们有很多种定义它的方法
var ary0 ArrayInt()
var ary1 [Int]()
var ary2: [Int] []let ary3 [Int](repeating: 0, count: 100)
let ary4 [1,2,3,4,5]
let ary5 Array((0..100))如上代码所示我们还可以通过 let 和 var 关键字来调整数组的可变性。
一般来说Swift 数组中的元素类型都是同构或同质homogeneous的这可以从它定义中只有一个泛型元素类型参数来得到印证。 这里不考虑使用 AnyObject 或 Any 作为数组的元素类型也不考虑使用 Swift 5.7 之后的 any ProtocolType 来“打包存放”遵循相同协议的不同元素类型。 不过通过巧妙的利用枚举我们可以间接的向其内部“注入”异构heterogeneous类型的数据
enum MixedValue {case int(Int)case string(String)
}let ary: [MixedValue] [.int(1337), .string(Hello)]如上代码所示虽然表面上看数组 ary 中放入了 Int 和 String 两种不同类型的数据但其实它们都是同一种 MixedValue 枚举类型。 关于更多 Swift 中枚举类型的介绍请小伙伴们恣意观赏下面的视频课 Swift 基本功修炼深入浅出 Swift 中的枚举类型 Array 中元素的存放是有顺序的无论我们遍历数组 1 千遍或是 1 万遍它们的顺序都是绝对不会变的。
除此之外数组中的元素是可以相同的没有哪条规定说数组不能放入一样的东西进去。这也是为什么数组定义中其元素Element类型是没有任何限制条件的。
Array 本身为我们提供了丰富的方法可供调用其中最常用的一个恐怕得算是 first(where:) 方法了它被用来在数组中查找符合条件的元素
let ary: [Int] [1337, 1338, 1339]let item ary.first(where: { $0 1340 })需要注意的是first(where:) 方法可能返回 nil 值哦。
2. Set 其人
简单聊完了数组之后接下来我们再来看看 Set 类型。
Set 同样是一种保存同质元素的容器我们也可以用多种方式来初始化它的实例
let set0 SetInt ([1, 2, 2, 3, 3, 4, 4, 5, 5])
print (set0)var set1: SetString []
set1.insert (Hopy)
set1.insert (Hopy)
set1.insert (Panda )
print (set1)从上面代码来看 Set 和 Array 很相似不过它们却有一个关键的不同Set 中的元素必须遵守 Hashable 协议。 这意味着不遵循 Hashable 的类型不能放到 Set 中去这在我们创建自定义类型时尤其需要注意。
遵循 Hashable 协议带来的另一个重要限制是Set 中的元素必须拥有相同的 Hash 值才行。如果插入 Set 的新元素和 Set 已有元素的 Hash 值相同则老元素会保持不动新元素则会被无情的“拒绝”。
class Item: Hashable, Equatable {let value: Intlet name: Stringstatic func (lhs: Item, rhs: Item) - Bool {lhs.value rhs.value}func hash(into hasher: inout Hasher) {hasher.combine(value)}init(value: Int, name: String) {self.value valueself.name name}deinit {print(\(name) deinited!)}
}var mySet SetItem()func test() {let item_0 Item(value: 1, name: hopy)let item_1 Item(value: 1, name: 大熊猫侯佩)mySet.insert(item_0)mySet.insert(item_1)
}test()
print(mySet.first?.name)以上代码运行结果如下所示 我们可以用 contains() 方法来检查 Set 是否包含指定的元素我们同样可以用与数组类似的 first(where:) 方法来查找集合中符合条件的元素。
Set 和数组另一个非常重要的区别是Set 是无序的。
当我们多次遍历同一个 Set 时即可发现其内部元素的顺序是无法保持稳定的。
如果大家希望兼顾 Array 和 Set 两者的优点有序且唯一我们可以使用 Apple 官方 swift-collections package 库中的 OrderedSet 类型
apple / swift-collections 更多 Swift 语言中集合类型的介绍请感兴趣的小伙伴们移步如下博文观赏进一步精彩的内容
Swift 入门学习集合Collection类型趣谈-上Swift 入门学习集合Collection类型趣谈-下 3. 考量运行性能
现在我们已经分别简单介绍了 Swift 中的 Array 和 Set 两种类型不过它们到底“孰是孰非”我们还是无所适从。
接下来我们就从两者运行性能的角度来分析一番吧。
分析数组和集合性能的重要因素是它们内部元素遍历的速度。
数组元素遍历性能是 O(n)这意味着在最坏的情况下我们需要找遍数组中的所有元素才能得偿所愿这在数组包含海量元素时会变得“蜗行牛步”。
反过来集合元素遍历性能却是 O(1)这说明要捕获 Set 内部任意元素所花费的时间都是一个“常数”不管它们的数量是 100 个或是 1 亿个。
通过上面的讨论我们清楚可知一点如果我们的目的就是用最快的速度从一大堆对象里查找心仪的元素那么 Set 是当仁不让的选择。 包含海量元素的数组在使用中往往是性能的“阿格琉斯之踵”如果对此感兴趣的小伙伴们可以移步到以下博文中进一步学习性能优化之道
你敢信!?几行代码让Swift数组初始化提速400多倍!SwiftUI一招让List巨量数据刷新UI速度快100倍有趣简单的M2处理器性能实验Swift与C代码执行速度的比较Swift忽略大小写搜索子字符串的三种方法及性能对比 4. Array 和 Set 选择原则
综上所述我们认为在 Set 和 Array 之间选择的最佳决策是基于实际撸码的“情境”。
当我们拥有一个哈希项目Item列表这些项目在一个集合中需要是唯一的且无需排序这时我们倾向于使用 Set。
如果你关心秩序或者你无法使 Item 遵守 Hashable 协议这貌似不大可能那么我们更应考虑使用数组。
当然也有一个例外即我们可能希望在维持元素顺序稳定时同时保证唯一性。在这种情况下我们可以选择使用 swift-collections 框架中的OrderedSet有序集合类型。
最后一个非常重要的撸码要诀是我们的决定总是优先基于以上原则而不是首先考虑性能之类的东东。除非我们正在编写一段性能非常关键的代码而在该代码中有足够的证据来证明 Set 和 Array 间的性能优劣。
记住过早优化是万恶之源切记切记 想要系统学习 Swift 语言的小伙伴们千万不要错过我的《Swift 语言开发精讲》专栏哦欢迎大家恣意观赏 Swift 语言开发精讲 总结
在本篇博文中我们简单介绍了 Swift 语言中数组Array和集合Set两种类型的特性并比较了它们在实际运行中的性能最后我们进一步探讨了选择它们的基本原则。
感谢观赏再会 文章转载自: http://www.morning.thzgd.cn.gov.cn.thzgd.cn http://www.morning.ujianji.com.gov.cn.ujianji.com http://www.morning.pjtw.cn.gov.cn.pjtw.cn http://www.morning.ylzdx.cn.gov.cn.ylzdx.cn http://www.morning.rycd.cn.gov.cn.rycd.cn http://www.morning.ztjhz.cn.gov.cn.ztjhz.cn http://www.morning.ndmbz.cn.gov.cn.ndmbz.cn http://www.morning.tkflb.cn.gov.cn.tkflb.cn http://www.morning.qrqg.cn.gov.cn.qrqg.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.qstkk.cn.gov.cn.qstkk.cn http://www.morning.xbbrh.cn.gov.cn.xbbrh.cn http://www.morning.qcsbs.cn.gov.cn.qcsbs.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.rdtp.cn.gov.cn.rdtp.cn http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn http://www.morning.wjrtg.cn.gov.cn.wjrtg.cn http://www.morning.zjrnq.cn.gov.cn.zjrnq.cn http://www.morning.pqwhk.cn.gov.cn.pqwhk.cn http://www.morning.qtyfb.cn.gov.cn.qtyfb.cn http://www.morning.playmi.cn.gov.cn.playmi.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.qrzwj.cn.gov.cn.qrzwj.cn http://www.morning.rlsd.cn.gov.cn.rlsd.cn http://www.morning.rgxll.cn.gov.cn.rgxll.cn http://www.morning.qbjrl.cn.gov.cn.qbjrl.cn http://www.morning.langlaitech.cn.gov.cn.langlaitech.cn http://www.morning.ymwcs.cn.gov.cn.ymwcs.cn http://www.morning.kfysh.com.gov.cn.kfysh.com http://www.morning.dwwlg.cn.gov.cn.dwwlg.cn http://www.morning.ccdyc.cn.gov.cn.ccdyc.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.qzxb.cn.gov.cn.qzxb.cn http://www.morning.dnphd.cn.gov.cn.dnphd.cn http://www.morning.tjndb.cn.gov.cn.tjndb.cn http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.yxlpj.cn.gov.cn.yxlpj.cn http://www.morning.pdmsj.cn.gov.cn.pdmsj.cn http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.sbpt.cn.gov.cn.sbpt.cn http://www.morning.bssjz.cn.gov.cn.bssjz.cn http://www.morning.rqkk.cn.gov.cn.rqkk.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.smpmn.cn.gov.cn.smpmn.cn http://www.morning.rmdsd.cn.gov.cn.rmdsd.cn http://www.morning.rydhq.cn.gov.cn.rydhq.cn http://www.morning.sbrjj.cn.gov.cn.sbrjj.cn http://www.morning.rwnx.cn.gov.cn.rwnx.cn http://www.morning.bwmm.cn.gov.cn.bwmm.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.nhbhc.cn.gov.cn.nhbhc.cn http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn http://www.morning.btypn.cn.gov.cn.btypn.cn http://www.morning.mqdr.cn.gov.cn.mqdr.cn http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn http://www.morning.slzkq.cn.gov.cn.slzkq.cn http://www.morning.bhwz.cn.gov.cn.bhwz.cn http://www.morning.kzrg.cn.gov.cn.kzrg.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.jfymz.cn.gov.cn.jfymz.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.kxyqy.cn.gov.cn.kxyqy.cn http://www.morning.tpmnq.cn.gov.cn.tpmnq.cn http://www.morning.rnnq.cn.gov.cn.rnnq.cn http://www.morning.mldrd.cn.gov.cn.mldrd.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.shawls.com.cn.gov.cn.shawls.com.cn http://www.morning.xpgwz.cn.gov.cn.xpgwz.cn http://www.morning.fwllb.cn.gov.cn.fwllb.cn http://www.morning.wnqfz.cn.gov.cn.wnqfz.cn http://www.morning.kjyfq.cn.gov.cn.kjyfq.cn http://www.morning.kpxnz.cn.gov.cn.kpxnz.cn http://www.morning.stmkm.cn.gov.cn.stmkm.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.rjjys.cn.gov.cn.rjjys.cn http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn