963 Stimmen

Wie man in Swift eine Schleife mit Index und Element iteriert

Gibt es eine Funktion, die ich verwenden kann, um über ein Array zu iterieren und sowohl den Index als auch das Element zu haben, ähnlich wie bei enumerate in Python?

for index, element in enumerate(list):
    ...

1968voto

Cezar Punkte 54048

Ja. Ab Swift 3.0, wenn Sie den Index für jedes Element zusammen mit seinem Wert benötigen, können Sie die enumerated() Methode verwenden, um über das Array zu iterieren. Es gibt eine Sequenz von Paaren zurück, die aus dem Index und dem Wert für jedes Element im Array bestehen. Zum Beispiel:

for (index, element) in list.enumerated() {
  print("Element \(index): \(element)")
}

Vor Swift 3.0 und nach Swift 2.0 hieß die Funktion enumerate():

for (index, element) in list.enumerate() {
    print("Element \(index): \(element)")
}

Vor Swift 2.0 war enumerate eine globale Funktion.

for (index, element) in enumerate(list) {
    println("Element \(index): \(element)")
}

159voto

Imanou Petit Punkte 83480

Swift 5 bietet eine Methode namens enumerated() für Array. enumerated() hat die folgende Deklaration:

func enumerated() -> EnumeratedSequence>

Gibt eine Sequenz von Paaren (n, x) zurück, wobei n eine auf null beginnende fortlaufende Ganzzahl darstellt und x ein Element der Sequenz darstellt.


In einfachsten Fällen können Sie enumerated() mit einer for-Schleife verwenden. Zum Beispiel:

let list = ["Auto", "Fahrrad", "Flugzeug", "Boot"]
for (index, element) in list.enumerated() {
    print(index, ":", element)
}

/*
prints:
0 : Auto
1 : Fahrrad
2 : Flugzeug
3 : Boot
*/

Beachten Sie jedoch, dass Sie enumerated() nicht auf eine for-Schleife beschränkt sind. Tatsächlich, wenn Sie planen, enumerated() für etwas Ähnliches wie den folgenden Code mit einer for-Schleife zu verwenden, machen Sie etwas falsch:

let list = [Int](1...5)
var arrayOfTuples = [(Int, Int)]()

for (index, element) in list.enumerated() {
    arrayOfTuples += [(index, element)]
}

print(arrayOfTuples) // prints [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

Eine schnellere Möglichkeit, dies zu tun, ist:

let list = [Int](1...5)
let arrayOfTuples = Array(list.enumerated())
print(arrayOfTuples) // prints [(offset: 0, element: 1), (offset: 1, element: 2), (offset: 2, element: 3), (offset: 3, element: 4), (offset: 4, element: 5)]

Alternativ können Sie enumerated() auch mit map verwenden:

let list = [Int](1...5)
let arrayOfDictionaries = list.enumerated().map { (a, b) in return [a : b] }
print(arrayOfDictionaries) // prints [[0: 1], [1: 2], [2: 3], [3: 4], [4: 5]]

Darüber hinaus, obwohl es einige Einschränkungen gibt, kann forEach eine gute Alternative zu einer for-Schleife sein:

let list = [Int](1...5)
list.reversed().enumerated().forEach { print($0, ":", $1) }

/*
prints:
0 : 5
1 : 4
2 : 3
3 : 2
4 : 1
*/

Indem Sie enumerated() und makeIterator() verwenden, können Sie sogar manuell auf Ihrem Array iterieren. Zum Beispiel:

import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    var generator = ["Auto", "Fahrrad", "Flugzeug", "Boot"].enumerated().makeIterator()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.setTitle("Klicken", for: .normal)
        button.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
        button.addTarget(self, action: #selector(iterate(_:)), for: .touchUpInside)
        view.addSubview(button)
    }

    @objc func iterate(_ sender: UIButton) {
        let tuple = generator.next()
        print(String(describing: tuple))
    }

}

PlaygroundPage.current.liveView = ViewController()

/*
 Optional((offset: 0, element: "Car"))
 Optional((offset: 1, element: "Bike"))
 Optional((offset: 2, element: "Plane"))
 Optional((offset: 3, element: "Boat"))
 nil
 nil
 nil
 */

60voto

Ricky Punkte 3053

Anfangend mit Swift 2 muss die enumerate Funktion auf der Sammlung wie folgt aufgerufen werden:

for (index, element) in list.enumerate() {
    print("Element \(index): \(element)")
}

54voto

Arnaud Punkte 16317

Ich habe diese Antwort gefunden, während ich nach einem Weg gesucht habe, dies mit einem Dictionary zu tun, und es stellt sich heraus, dass es recht einfach ist, es anzupassen, geben Sie einfach ein Tupel für das Element.

// Swift 2

var list = ["a": 1, "b": 2]

for (index, (letter, value)) in list.enumerate() {
    print("Element \(index): \(letter) \(value)")
}

50voto

Rabel Ahmed Punkte 1231

Swift 5.x:

let list = [0, 1, 2, 3, 4, 5]

list.enumerated().forEach { (index, value) in
    print("index: \(index), value: \(value)")
}

Or,

list.enumerated().forEach { 
    print("index: \($0.offset), value: \($0.element)")
} 

Or,

for (index, value) in list.enumerated() {
    print("index: \(index), value: \(value)")
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X