Swift 集合类新协议 Collection

集合类型

集合类型 (Collection) 指的是那些稳定的序列,它们能够被多次遍历且保持一致。除了线性遍历以外,集合中的元素也可以通过下标索引的方式被获取到,因此集合类型不能是无限的

Collection协议

Swift中Collection协议是建立在Sequence协议之上的,为有限的序列提供下标访问的能力,同时增加了count属性,自定义索引等特性

想要遵守Collection协议,除了实现Sequence要求的方法,还包括下标索引相关的方法。而swift中的下标索引除了可见的下标(整数)还有不可见下标索引(哈希),所以必须选取一个合适的索引来表达集合中元素的位置,好在系统提供了默认实现。实际满足Collection协议的最小要求如下:

struct customCollection<T>:Collection{
    var buffer:[T]
    typealias Index = Int
    // startIndex 和 endIndex
    var startIndex: Index{ get }
    var endIndex: Index{ get }

    //集合索引之间 步进 
    func index(after i: Index) -> Index
    //至少能够读取你的类型中的元素下标方法
    subscript(position: Index) -> T { get }
    }

关联类型

associatedtype Iterator = IndexingIterator<Self>

IndexingIterator迭代器

这是从Sequence继承来的,IndexingIterator是集合的迭代器, 实现了IteratorProtocol要求的next()方法,用集合自身的索引迭代每个元素

struct IndexingIterator<Elements: Collection> {
  //...
  //IteratorProtocol 协议要求的next()
    public mutating func next() -> Elements.Element? {
    if _position == _elements.endIndex { return nil }
    let element = _elements[_position]
    _elements.formIndex(after: &_position)
    return element
  }
  //...
}

SubSequence

associatedtype SubSequence: Collection = Slice<Self>
  where SubSequence.Index == Index,
        Element == SubSequence.Element,
        SubSequence.SubSequence == SubSequence

集合都能够进行切片操作,返回SubSequence子类型,SubSequence本身也是一个Collection,是从Sequence协议继承来的,类型Slice<Self>是对原来集合的分装,集合类型和它的切片拥有相同的索引

Indices

  associatedtype Indices: Collection = DefaultIndices<Self>
    where Indices.Element == Index, 
          Indices.Index == Index,
          Indices.SubSequence == Indices

它是集合中所有有效索引按升序排列组成的集合,不包含endIndex

index

associatedtype Index: Comparable

Collection协议对Index的要求是遵守Comparable协议,每个集合都有两个特殊的索引值:startIndex 和 endIndex。startIndex 指定集合中第一个元素,endIndex 是集合中最后一个元素的下一个位置,内置类型Array的索引类型是Int类型,String的索引类型是StringIndex,字典Dictionary的索引类型是DictionaryIndex

index(after:)

func index(after i: Index) -> Index

从一个给定索引计算出下一个元素的索引

自定义集合遵守Collection协议

struct customCollection<T>:Collection{
    var buffer:[T]
   //简单的数组类型,索引类新定义为Int即可
    typealias Index = Int
    var startIndex: Int {
        return 0
    }
    var endIndex: Int {
        return buffer.count
    }
    func index(after i: Int) -> Int {
        return I+1
    }
    subscript(position: Int) -> T {
        return buffer[position]
    }
}
var collection = customCollection(buffer: [1,2,3,4,5,6,7,8,9,10])
// 可通过下标访问
collection[5]// 6
//可以遍历
for i in collection{
    print(i)
}

通过遵守Collection协议,自定义类型customCollection拥有来自Sequence和Collection协议中的全部属性和方法

特定的集合类型协议

Collection协议的基本要求是为有限的序列提供下标访问能力,但是大多数集合还包括修改,移除元素,替换等操作。当然,这并不是说满足 Collection 的类型不能拥有这些能力,只是 Collection 协议自身没有把它们当作必须要实现的功能。

有些算法会对集合支持的操作有额外的要求,这使得只有部分集合可以和它们搭配在一起工作。如果可以把这些额外的要求抽象出来形成一些通用的集合变体,用起来就会更加方便。为此,标准库提供了四个专门的集合类型,每一个都用特定的方式给 Collection 追加了新的功能

支持双向索引的集合BidirectionalCollection

随机存取集合类型RandomAccessCollection

可变集合协议,支持原地修改元素MutableCollection

添加,移除操作的元素的集合RangeReplaceableCollection


最后附上一张Swift集合协议大家族构成图:

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

推荐阅读更多精彩内容