Gibt es eine Funktion, mit der ich über ein Array iterieren und sowohl Index als auch Element haben kann, wie z. B. Pythons Aufzählung?
for index, element in enumerate(list):
...
arrays
swift
enumeration
thinker3
quelle
quelle
enumerate
?enumerating
für Swift 4 Aufregend!for (index, element) in
bei der Verwendungenumerated
ist irreführend. sollte seinfor (offset, element) in
Swift 5 stellt ein Verfahren genannt
enumerated()
fürArray
.enumerated()
hat die folgende Erklärung:In den einfachsten Fällen können Sie
enumerated()
eine for-Schleife verwenden. Zum Beispiel:Beachten Sie jedoch, dass Sie nicht auf die Verwendung
enumerated()
mit einer for-Schleife beschränkt sind. Wenn Sie vorhaben,enumerated()
eine for-Schleife für etwas zu verwenden, das dem folgenden Code ähnelt, machen Sie es falsch:Ein schnellerer Weg, dies zu tun, ist:
Alternativ können Sie auch verwenden
enumerated()
mitmap
:Darüber hinaus hat es zwar einige Einschränkungen ,
forEach
kann es außerdem ein guter Ersatz für eine for-Schleife sein:Mit
enumerated()
undmakeIterator()
können Sie sogar manuell auf Ihrem Computer iterierenArray
. Zum Beispiel:quelle
enumerate
?Ab Swift 2 muss die Aufzählungsfunktion für die Sammlung wie folgt aufgerufen werden:
quelle
Ich habe diese Antwort gefunden, als ich nach einer Möglichkeit gesucht habe, dies mit einem Wörterbuch zu tun , und es stellt sich heraus, dass es ziemlich einfach ist, sie anzupassen. Übergeben Sie einfach ein Tupel für das Element.
quelle
Sie können einfach eine Aufzählungsschleife verwenden, um das gewünschte Ergebnis zu erzielen:
Swift 2:
Swift 3 & 4:
Oder Sie können einfach eine for-Schleife durchlaufen, um das gleiche Ergebnis zu erhalten:
Ich hoffe es hilft.
quelle
Grundlegende Aufzählung
oder mit Swift 3 ...
Aufzählen, Filtern und Zuordnen
Am häufigsten verwende ich jedoch Aufzählung in Kombination mit Karte oder Filter. Zum Beispiel mit der Bearbeitung einiger Arrays.
In diesem Array wollte ich ungerade oder gerade indizierte Elemente filtern und sie von Ints in Doubles konvertieren. So
enumerate()
bekommt man Index und das Element, dann Filter prüfen der Index, und schließlich den resultierenden Tupel ich es nur das Element Karte loszuwerden.quelle
Verwenden von
.enumerate()
Werken, liefert jedoch nicht den wahren Index des Elements. Es wird nur ein Int bereitgestellt, das mit 0 beginnt und für jedes aufeinanderfolgende Element um 1 erhöht wird. Dies ist normalerweise irrelevant, aber es besteht die Möglichkeit eines unerwarteten Verhaltens, wenn es mit demArraySlice
Typ verwendet wird. Nehmen Sie den folgenden Code:Es ist ein etwas erfundenes Beispiel, und es ist in der Praxis kein alltägliches Problem, aber ich denke, es lohnt sich zu wissen, dass dies passieren kann.
quelle
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive element
Ja, deshalb heißt es Aufzählung . Außerdem ist Slice kein Array, daher ist es keine Überraschung, dass es sich anders verhält. Hier gibt es keinen Fehler - alles ist beabsichtigt. :)filter
zuerst verwenden?Beginnend mit Swift 3 ist es
quelle
Der Vollständigkeit halber können Sie einfach Ihre Array-Indizes durchlaufen und mithilfe des Index auf das Element am entsprechenden Index zugreifen:
ForEach verwenden
Sammlungsmethode
enumerated()
verwenden. Beachten Sie, dass eine Sammlung von Tupeln mitoffset
und zurückgegeben wirdelement
:mit forEach:
Diese werden gedruckt
Wenn Sie den Array-Index (nicht den Offset) und sein Element benötigen, können Sie Collection erweitern und eine eigene Methode erstellen, um die indizierten Elemente abzurufen:
Eine andere mögliche Implementierung, wie von Alex vorgeschlagen, besteht darin, die Sammlungsindizes mit ihren Elementen zu komprimieren:
Testen:
Dies wird gedruckt
quelle
enumeratedIndices
indem Sie mitzip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Übrigens mag ich die von mirindexedElements
for
Schleife funktioniert, aber auchzip(self.indices, self) .forEach(body)
forEach
macht eine for-Schleife hinter den Kulissen. Ich ziehe es vor, es einfach zu halten github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }
Dies ist die Formel der Aufzählungsschleife:
Weitere Details finden Sie hier .
quelle
Ich persönlich bevorzuge die
forEach
Methode:Sie können auch die Kurzversion verwenden:
quelle
Xcode 8 und Swift 3: Array können mit aufgelistet werden
tempArray.enumerated()
Beispiel:
Konsole:
quelle
Für diejenigen, die verwenden möchten
forEach
.Swift 4
Oder
quelle
Für das, was Sie tun möchten, sollten Sie die
enumerated()
Methode auf Ihrem Array verwenden :quelle
Wir haben die Aufzählungsfunktion aufgerufen, um dies zu implementieren. mögen
quelle