[swift 进阶]读书笔记-集合类型协议 C3P2_集合类型

集合类型协议

3.2集合类型:Collection


这一节只要目的是通过自定义一个FIFO(First Input First Output)的集合去了解一些细节。

稳定的序列(可多次遍历保持一致),可通过下标获取其中的元素。

知识点1:Collection建立在Sequence协议之上

知识点2:StringDataIndexSet也准守了Collection协议。

知识点3:swift数组可以当做栈 用append入栈,popLast出栈

注:数组是在连续的内存中持有元素,移除非末尾元素时,后面的元素都会移动填补空白,复杂度为O(n)。 做类似操作的时候可以从性能方面去考虑一下。

队列可以结合使用 push和remove(at:0)

为队列设计协议:Iterator


/// 自己写一个最简单的将元素入队和出队的类型
protocol Queue{
    ///self中所持有的元素类型
    associatedtype Element
    ///把newElement 加入队列
    mutating func enqueue(_ newElement: Element)
    ///从self出队一个元素
    /// 返回值是可选值? 队列为空时这样的做法是安全的
    mutating func dequeue() -> Element?
}

这就表述了队列的定义

队列的实现

下面我们将准守上面的Queue协议,写一个FIFO( First Input First Output)队列

///FIFO( First Input First Output)
struct FIFOQueue:Queue {
    
    fileprivate var left: [Int] = []
    fileprivate var right: [Int] = []
    
    ///把元素添加到队尾
    /// 复杂度O(1)
    mutating func enqueue(_ newElement: Int) {
        right.append(newElement)
    }
    
    
    /// 从队列首部移除一个元素
    /// 队列为nil时候返回空
    /// - 复杂度: 平摊 O(1)
    mutating func dequeue() -> Int? {
        if left.isEmpty {
            left = right.reversed()
            right.removeAll()
        }
        return left.popLast()
    }
}

入队添加到"右",
出队从"右"的反序"左"中被弹出。 "左"为空时再将"右"反序设置为左(好绕,不太理解的同学可以自己看着代码把流程走走就很快能理解啦~)

准守Collection协议


前面我们已经有一个FIFO队列了,下面可以为它添加Collection协议啦~ 在swift2.0的时候Collection协议有
4个关联类型
4个属性
7个实例方法
2个下标方法

在swift4.2中有略微改进。。具体可参照Collection 苹果官方文档

是不是有点慌。一开始看到的时候我也慌😂,其实捏 所有的关联类型都有默认值 除非你有特殊需求,一般不用关心的。

下面我们就开始让我们的FIFO去遵守Collection吧~

extension FIFOQueue:Collection {

    public var startIndex: Int { return 0 }
    public var endIndex: Int { return left.count + right.count}
    
    public func index(after i: Int) -> Int {
        precondition( i < endIndex)
        return i + 1
    }
    
    public subscript(position: Int) -> Int {
        precondition((0..<endIndex).contains(position),"Index out of bounds")
        if position < left.endIndex{
            return left[left.count - position - 1]
        }else{
            return right[position - left.count]
        }
    }
}

下面就可以愉快地使用我们创建的FIFOQueue啦~

遵守 ExpressibleByArrayLiteral协议


ExpressibleByArrayLiteral的主要作用是可以让对象支持字面量初始化
第一次看这个名词我也一脸懵。
其实就是让你的集合可以用[value1, value2, etc]的方式去创建。

extension FIFOQueue:ExpressibleByArrayLiteral{
    ///ExpressibleByArrayLiteral 的init方法去实现一下就ok~ 
    init(arrayLiteral elements: Int...) {
        self.init(left: elements.reversed(), right: [])
    }
}

关联类型


Iterator 是从Sequence 继承的关联类型。Iterator 是对集合的封装,用集合本身的索引去迭代每一个元素。 这里讲的比较简单,可百度,待补充。 (TO BE ENHANCEMENT)

文章源文件地址

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