Iteration über Arrays in Swift: Index und Element unter der Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie erhält man in Swift den Index eines Elements beim Durchlaufen eines Arrays? Wir analysieren eine häufig gestellte Frage

\n\n

Stellen Sie sich vor: Sie programmieren in Swift und möchten nicht nur ein Array durchlaufen, sondern auch wissen, an welcher Position sich jedes Element befindet. Ob Sie Elemente anhand ihres Index modifizieren, benachbarte Werte vergleichen oder einfach eine nummerierte Liste ausgeben möchten – die Aufgabe ist dieselbe. Die Frage "How to iterate a loop with index and element in Swift" hat auf Stack Overflow tausende Aufrufe gesammelt. Das zeigt, dass dieses Thema viele bewegt.

\n\n

In diesem Artikel geben wir nicht nur eine fertige Antwort. Wir schauen unter die Haube: Wir analysieren, welche Methoden es gibt, welche schneller ist, welche sicherer und warum eine davon – enumerated() – zum De-facto-Standard geworden ist. Los geht's!

\n\n

Das Problem: Warum reicht einfaches for-in nicht aus?

\n\n

Angenommen, Sie haben ein Array von Zeichenketten:

\n\n
let fruits = ["Apfel", "Banane", "Kirsche", "Melone"]
\n\n

Die naheliegendste Methode ist for-in:

\n\n
for fruit in fruits {\n    print(fruit)\n}
\n\n

Das gibt die Namen der Früchte aus. Aber was, wenn Sie den Index benötigen? Zum Beispiel: "1. Apfel, 2. Banane..."? Ein einfaches for-in liefert keinen Index. Man muss zu Workarounds greifen:

\n\n
var index = 0\nfor fruit in fruits {\n    print("\\(index). \\(fruit)")\n    index += 1\n}
\n\n

Funktioniert es? Ja. Ist es schön? Nein. Und was, wenn das Array leer ist? Oder wenn Sie versehentlich vergessen, index zu erhöhen? Willkommen in der Welt der Bugs. Swift bietet elegantere Lösungen.

\n\n

Methode Nr. 1: Der Klassiker – die Methode enumerated()

\n\n

Dies ist die beliebteste und empfohlene Methode. Die Methode enumerated() gibt eine Sequenz von Tupeln (offset: Int, element: Element) zurück. Sehen wir uns an, wie das funktioniert:

\n\n
for (index, fruit) in fruits.enumerated() {\n    print("\\(index + 1). \\(fruit)")\n}
\n\n

Ausgabe:

\n
1. Apfel\n2. Banane\n3. Kirsche\n4. Melone
\n\n

Was passiert unter der Haube?

\n\n

enumerated() erstellt kein neues Array. Es gibt eine faule Sequenz vom Typ EnumeratedSequence zurück. Das bedeutet, dass die Elemente nicht in eine neue Datenstruktur kopiert werden – sie werden im laufenden Betrieb "verpackt". Bei jedem Zugriff auf das nächste Element erhöht die Sequenz einfach den Zähler und gibt ein Tupel zurück. Dies ist sehr speichereffizient, insbesondere für große Sammlungen.

\n\n

Ein wichtiger Hinweis: offset beginnt immer bei 0. Wenn Sie einen Index ab 1 benötigen (wie bei der Nummerierung von Listen), addieren Sie einfach eins. Swift macht das nicht automatisch – dies ist eine bewusste Entscheidung der Sprachentwickler, um die Einheitlichkeit mit der Array-Indizierung zu wahren.

\n\n

enumerated() mit forEach

\n\n

Die Methode forEach unterstützt ebenfalls enumerated():

\n\n
fruits.enumerated().forEach { (index, fruit) in\n    print("\\(index). \\(fruit)")\n}
\n\n

Der Unterschied zwischen for-in und forEach ist wichtig: Innerhalb von forEach können break oder continue nicht verwendet werden. Wenn Sie die Schleife vorzeitig verlassen müssen, verwenden Sie for-in.

\n\n

Methode Nr. 2: Indizierung über einen Bereich (Range)

\n\n

Eine alte, aber immer noch anzutreffende Methode ist die Iteration über Indizes:

\n\n
for index in 0..<fruits.count {\n    print("\\(index). \\(fruits[index])")\n}
\n\n

Das scheint einfach. Aber es gibt Fallstricke:

\n\n
    \n
  • Sicherheit: Wenn sich das Array während der Iteration ändert (z. B. in Multithread-Code), kann fruits.count veraltet sein und Sie geraten außerhalb der Array-Grenzen.
  • \n
  • Lesbarkeit: Der Code wirkt "niedriger". Andere Entwickler brauchen eine zusätzliche Sekunde, um zu verstehen, was Sie tun.
  • \n
  • Leistung: Der Zugriff über den Index fruits[index] ist für Arrays eine O(1)-Operation, aber für andere
  • \n

Blogs

Buchempfehlungen