swift集合协议我帮你小结好了

swift标准库中为我们提供了三种类型的集合。八条8tiao 现在写一份非官方文档,把这些协议的作用以及之间的关系总结出来。方便大家将来深入学习集合的时候做参考。我们现在看一下Array、Dictionary、Set三种集合的定义形式(非完整定义)。

// Array的定义
public struct Array<Element> : CollectionType, MutableCollectionType {}
extension Array : _ArrayType {}
public protocol _ArrayType : RangeReplaceableCollectionType, MutableSliceable, ArrayLiteralConvertible {}

// Dictionary的定义
public struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible {}

// Set的定义
public struct Set<Element : Hashable> : Hashable, CollectionType, ArrayLiteralConvertible {}

// CollectionType的定义
public protocol CollectionType : Indexable, SequenceType {}

当前的整理是基于swift2.2,在swift3当中对协议做了调整,例如用MutableCollectionType协议替代了MutableSliceable协议,在下面我们会提到。

如果你现在还不了解genernator,sequence。可以看另外一篇内容了解Generators VS Sequences VS Collections

一、二、三、四、五上山打老虎,我们现在就开始扒一扒这些协议的作用。
所有的集合都一定准守 CollectionType 协议(否则就不是集合类型啦),而CollectionType继承了
SequenceType协议,所以,我们从这从它开始吧。

SequenceType协议

我们经常在集合类型对象上面使用的map()、filter()等方法它们其实就是来自于SequenceType协议
只要我们准守了SequenceType协议,我们可以默认获得下面这些方法,而且是协议提供的默认实现,不需要我们自己动手哦,是不是相当划算?

  • contains
  • enumerat
  • filter
  • join
  • lazy
  • map
  • maxElement
  • minElement
  • reduce
  • sorted
  • startsWith
  • underestimateCount
  • zip

CollectionType / MutableCollectionType

MutableCollectionType协议和CollectionType协议的区别在于,MutableCollectionType协议的下标方法中提供了set方法,so,mutable!!!!!如果我们实现CollectionType协议,那我们需要提供两个属性 startIndex 和 endIndex,并且提供一个下标方法 subscript()用来返回数组下标对应的元素。实现一个CollectionType协议的好处也是多多滴,我们可以获得如下方法。

  • count
  • find
  • first
  • indices
  • isEmpty
  • last
  • partition
  • reverse
  • sort

这些方法都太熟悉了吧,其实它们就是属于CollectionType协议的,而且协议也我们提供了默认实现!!!

MutableSliceable

我们经常需要在数组上面截取一部分数据(dropLast方法就意味着截取不包括最后一个元素的片段),截取后获得的是slice类型的对象,slice类型的对象和原数组共享indices属性,并且共享同一段内存空间,就像视图的性质那样,但一旦发生数据变化,那么双方就会分别获得自己独立的存储空间。

虽然swift3将会把MutableSliceable协议去掉,但它的所提供的能力并没有去掉,而是使用MutableCollectionType进行了替代。如果我们实现了MutableSliceable协议,我们会获得一下方法。

  • dropFirst
  • dropLast
  • prefix
  • split
  • suffix

RangeReplaceableCollectionType

我们使用数组的时候,总是需要对数组进行管理操作的吧,比方说增、删、改数组的内部元素。定义这些任务就是RangeReplaceableCollectionType协议存在的价值,如果我们准守了RangeReplaceableCollectionType协议,那么我们将会获得以下管理数组的方法。

  • extend
  • insert
  • removeAll
  • removeLast
  • removeRange
  • splice

内容中的方法都没有提供说明,一个是考虑官方文档中有详细说明,另外一个考虑都是常用的方法。本文主要是给集合的最基本协议和方法进行归类总结。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容