Für die technische Freude daran: eine andere Alternative wäre, um eine Sequenz zu definieren welches zyklisch über die Elemente des Arrays läuft.
eine unveränderliche Array Gegeben:
class Foo {
private let array: [String]
private lazy var cyclingSequenceOverArray:
UnfoldSequence<String, Int> = sequence(state: -1) {
(state: inout Int) -> String? in
guard !self.array.isEmpty else { return nil }
return self.array[(state = (state + 1) % self.array.count, state).1]
}
init(_ array: [String]) {
self.array = array
}
func printNext() {
if let next = cyclingSequenceOverArray.next() {
print(next)
}
}
}
let foo = Foo(["a", "b", "c", "d"])
foo.printNext() // a
foo.printNext() // b
foo.printNext() // c
foo.printNext() // d
foo.printNext() // a
foo.printNext() // b
In dem Fall, dass Sie das Array wandelbar sein lassen (var
), und es wird immer leer: ein Aufruf an die next()
Methode (wie oben ausgeführt) von Die Sequenz beendet die Sequenz. D. h., Selbst wenn das Array erneut gefüllt würde, würden nachfolgende Aufrufe an next()
immer noch nil
ergeben. In diesem Fall könnten Sie die Sequenz lassen unendlich sein (nie abbreche), einfach einen Standardwert bei der Rückkehr des Array nil
:
class Foo {
var array: [String]
private lazy var cyclingSequenceOverArray:
UnfoldSequence<String, Int> = sequence(state: -1) {
(state: inout Int) -> String in
guard !self.array.isEmpty else { return (state = -1, "Empty!").1 }
return self.array[(state = (state + 1) % self.array.count, state).1]
}
init(_ array: [String]) {
self.array = array
}
func printNext() {
if let next = cyclingSequenceOverArray.next() {
print(next)
}
}
}
Beispiel Nutzung:
let foo = Foo(["a", "b", "c", "d"])
foo.printNext() // a
foo.printNext() // b
foo.printNext() // c
foo.array = []
foo.printNext() // Empty!
foo.printNext() // Empty!
foo.array = ["a", "b", "c", "d"]
foo.printNext() // a
foo.printNext() // b
foo.array[2] = "C"
foo.printNext() // C
foo.array = ["1", "2", "3"]
foo.printNext() // 1
irrelevant Frage Titel –