Sie können enumerate
eine Sequenz ( usw.) in eine Sequenz von Tupeln konvertieren Array
, String
wobei ein ganzzahliger Zähler und ein Element miteinander gepaart sind. Das ist:
let numbers = [7, 8, 9, 10]
let indexAndNum: [String] = numbers.enumerate().map { (index, element) in
return "\(index): \(element)"
}
print(indexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Link zu enumerate
Definition
Beachten Sie, dass dies nicht mit dem Abrufen des Index der Sammlung identisch ist. enumerate
Sie erhalten einen ganzzahligen Zähler zurück. Dies entspricht dem Index für ein Array, ist jedoch für eine Zeichenfolge oder ein Wörterbuch nicht sehr nützlich. Um den tatsächlichen Index zusammen mit jedem Element zu erhalten, können Sie Folgendes verwenden zip
:
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
Wenn Sie eine Aufzählungssequenz mit verwenden reduce
, können Sie den Index und das Element in einem Tupel nicht trennen, da Sie das akkumulierende / aktuelle Tupel bereits in der Methodensignatur haben. Stattdessen müssen Sie verwenden .0
und .1
auf dem zweiten Parameter zu Ihrer reduce
Schließung:
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0 und höher
Da Swift 3.0 Syntax ist ganz anders.
Sie können auch Short-Syntax / Inline verwenden, um das Array im Wörterbuch abzubilden:
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
Das ergibt:
[(0, 7), (1, 8), (2, 9), (3, 10)]
numbers.enumerate().map { (index, element) in ...
.reduce
nachenumerate()
oder verwendenzip
.enumerate
ist jetztenumerated
Denn
Swift 2.1
ich habe nächste Funktion geschrieben:Und dann benutze es so:
quelle
Wenn Sie mit Swift 3 ein
Sequence
protokollkonformes Objekt haben und jedes Element darin mit seinem Index verknüpfen möchten, können Sie dieenumerated()
Methode verwenden.Beispielsweise:
Daher können Sie im einfachsten Fall einen Luhn-Algorithmus auf einem Spielplatz wie folgt implementieren:
Wenn Sie von a ausgehen
String
, können Sie es folgendermaßen implementieren:Wenn Sie diese Vorgänge wiederholen müssen, können Sie Ihren Code in eine Erweiterung umgestalten:
Oder sehr prägnant:
quelle
Zusätzlich zu Nate Cooks Beispiel von
map
können Sie dieses Verhalten auch auf anwendenreduce
.Es ist zu beachten, dass die
EnumerateSequence
in den Verschluss übergebenenenumerated
Elemente nicht verschachtelt zerlegt werden können, daher müssen die Elemente des Tupels innerhalb des Verschlusses zerlegt werden (dhenumerated.index
).quelle
Dies ist eine funktionierende CollectionType- Erweiterung für Swift 2.1 mit Würfen und erneuten Würfen:
Ich weiß, das haben Sie nicht gefragt, aber es löst Ihr Problem. Sie können diese schnelle 2.0 Luhn-Methode ausprobieren, ohne etwas zu erweitern:
quelle