Swift:Generators 与 Sequences 浅析

前言

GeneratorsSequences构成了Swift式循环。

Generators

提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候Generators就可以派上用场了。

一个字:Generators的存在是进行特殊癖好的数组遍历,其筛选出符合该癖好的下标索引到数组没有元素为止。

怎么玩

任意一个generator都需要遵从如下协议:

protocol GeneratorType { 
    typealias Element
    func next() -> Element?
}

根据上述协议,该协议需要元素类型以及一个next()函数。

举个倒序索引的generator:

class CountdownGenerator: GeneratorType {
    typealias Element = Int
    var element: Element

    init<T>(array: [T]) {
        self.element = array.count - 1
    }

    func next() -> Element? {
        return self.element < 0 ? nil : element--
    }
}

// TEST CASE
let xs = ["A", "B", "C"]
let generator = CountdownGenerator(array: xs)
while let i = generator.next() {
    println("Element \(i) of the array is \(xs[i])")
}

好处是啥

好处是啥,我的总结是把一个很抽象遍历模式使用Generators的方式剥离出来,当你对当前的迭代循环方式不爽的时候只需要修改一下当前的这个generator。更直观的“头疼医头,脚疼医脚”。

Sequences

Generators在循环过程中每个元素提供的服务是一次性的。所以我们想做倒回操作的话需要生成一个新的generator。若不想这样则需要用上sequence,其遵从另外一个协议SequenceType

怎么玩

protocol SequenceType {
    typealias Generator: GeneratorType 
    func generate() -> Generator
}

通过协议我们知道每个sequence都与一个generator类型已经一个generator构造器绑定在一起。我们可以使用这个遍历sequence

举个栗子,我们可以使用CountdownGenerator来定义一个sequence从而生成一个倒序的数组。

struct ReverseSequence<T>: SequenceType {
    var array: [T]
    init(array: [T]) {
        self.array = array
    }

    typealias Generator = CountdownGenerator

    func generate() -> Generator {
        return CountdownGenerator(array: array)
    }
}

// TEST CASE
    let xs = ["A", "B", "C"]
    let reverseSequence = ReverseSequence(array: xs)
    let reverseGenerator = reverseSequence.generate()
    while let i = reverseGenerator.next() {
        println("Index \(i) is \(xs[i])")
    }

    // 利用熟悉的OO
    for i in ReverseSequence(array: xs) {
        println("Index \(i) is \(xs[i])")
    }

好处是啥

不用每次进行Loop操作的时候都去生成一个新的generator,提升代码的统一性。


转载地址:http://segmentfault.com/a/1190000002464158

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值