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):
...
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):
...
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)")
}
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
*/
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)")
}
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 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.