2016-07-27 17 views
0

In Python gibt es itertools.cycle, die eine iterable nimmt und einen iterierbaren Iterator erstellt, der wiederholt den Inhalt aus der Quelle liefert.Zyklus-Iterator in Swift

Ich möchte dieses Verhalten in Swift replizieren.

Ein Kandidat für dieses Verhalten zu replizieren die Standard-Bibliothek wäre repeatElement(_:count:): tun repeatElement(seq, count: 5).flatMap({$0}) eine Anordnung der Elemente der seq fünf Mal schafft, aber das meine Anforderungen nicht erfüllt, da es nur seq eine endliche Anzahl von Malen wiederholt. Zusätzlich wird ein Array der Länge 5 * seq.length erstellt, wobei nur ein Cache der Länge seq tatsächlich benötigt wird.

Also die Frage ist: Wie kann ich eine unendliche Sequence durch Wiederholen der Elemente einer Quelle Sequence erstellen? Die Lösung sollte keine Platzkosten von mehr als O(n) haben. (A O(1) wäre unmöglich, in Swift zu garantieren, als Sequencemakes no guarentee that it can be iterated multiple times.)

Antwort

0

Was manuell los mit einem Sequence durch einen Array-Zugriff gesichert Implementierung Modulo seiner Länge? Mit etwas Sorgfalt muss Ihr Index niemals überlaufen, und Sie können so lange weitermachen, wie Sie möchten.

Beachten Sie, dass die API-Dokumentwarnung mehr wie eine freundliche Erinnerung liest, dass die Wiederverwendung kein obligatorischer Teil des Schnittstellenvertrags Sequence ist. Das schließt jedoch nicht aus, dass Ihre bestimmte Implementierung zwischen mehreren Schleifen wiederverwendet werden kann.