Swift:Generators 与 Sequences 浅析

Swift:Generators 与 Sequences 浅析,第1张

概述前言 Generators与Sequences构成了Swift式循环。 Generators 提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候Generators就可以派上用场了。 一个字:Generators的存在是进行特殊癖好的数组遍历,其筛选出符合该癖好的下标索引到数组没有元素为止。 怎么玩 任意一个generator都需 前言

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 CASElet xs = ["A","B",152)">"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 = ["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

总结

以上是内存溢出为你收集整理的Swift:Generators 与 Sequences 浅析全部内容,希望文章能够帮你解决Swift:Generators 与 Sequences 浅析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1088028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存