Swift:Generators 与 Sequences 浅析
前言 Generators 提到数组我们就会想到遍历,一般的遍历可能都是从头到尾进行的。但是如果你有特殊的需求呢。你可能不想呆板的进行遍历。这时候 一个字:Generators的存在是进行特殊癖好的数组遍历,其筛选出符合该癖好的下标索引到数组没有元素为止。 怎么玩任意一个generator都需要遵从如下协议: protocol GeneratorType {
typealias Element
func next() -> Element?
}
根据上述协议,该协议需要元素类型以及一个 举个倒序索引的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",152)">"C"]
let generator = CountdownGenerator(array: xs)
while let i = generator.next() {
println("Element (i) of the array is (xs[i])")
}
好处是啥 好处是啥,我的总结是把一个很抽象遍历模式使用 SequencesGenerators在循环过程中每个元素提供的服务是一次性的。所以我们想做倒回操作的话需要生成一个新的 怎么玩protocol SequenceType {
typealias Generator: GeneratorType
func generate() -> Generator
}
通过协议我们知道每个 举个栗子,我们可以使用 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |