SequenceType
supporta solo generate()
. Forse un approccio più "rapido" potrebbe essere quello di definire un Generator
che ha un indice di inizio e di fine e un generatore di "base" salterà sui primi elementi, inizierà a restituire alcuni, e quindi si fermerà dopo l'indice finale. In questo modo:
struct SubscriptGenerator<Base: GeneratorType> : GeneratorType {
var nowIndex : Int = 0
let endIndex : Int
let begIndex : Int
var generator : Base
init (generator: Base, startIndex: Int, endIndex: Int) {
precondition(startIndex < endIndex, "oops")
self.generator = generator
self.endIndex = endIndex
self.begIndex = startIndex
}
// MARK - GeneratorType
typealias Element = Base.Element
mutating func next() -> Element? {
while (nowIndex < begIndex) { nowIndex++; generator.next() }
return nowIndex++ < endIndex ? generator.next() : nil
}
}
Questo è solo un esempio. Si potrebbe definire un convenience init()
che prende uno SequenceType
e produce il generatore di base. In azione:
75> var gen = [10,20,30,40,50].generate()
76> var sg = SubscriptGenerator(generator: gen, startIndex: 1, endIndex:3)
sg: SubscriptGenerator<IndexingGenerator<[Int]>> = { ... }
77> sg.next()
$R2: Int? = 20
78> sg.next()
$R3: Int? = 30
79> sg.next()
$R4: Int? = nil
See Swift della EnumerateGenerator
per un esempio.
Nota: potrebbe essere il Stride
nesso di funzionalità di Swift fa quello che vuoi già.
Hai provato 'foo [0 ..
wltrup
Non è possibile iscriversi 'SequenceType'. –
@RobNapier Ah, ok, bene, tanto per il mio suggerimento. :) – wltrup