Ich versuche ein zu finden, item index
indem ich ein suche list
. Weiß jemand, wie man das macht?
Ich sehe es gibt list.StartIndex
und list.EndIndex
aber ich möchte so etwas wie Pythons list.index("text")
.
Da Swift in mancher Hinsicht funktionaler als objektorientiert ist (und Arrays Strukturen und keine Objekte sind), verwenden Sie die Funktion "find", um das Array zu bearbeiten, das einen optionalen Wert zurückgibt. Seien Sie also darauf vorbereitet, einen Nullwert zu verarbeiten:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Update für Swift 2.0:
Die alte find
Funktion wird mit Swift 2.0 nicht mehr unterstützt!
Mit Swift 2.0 können Array
Sie den Index eines Elements mithilfe einer Funktion ermitteln, die in einer Erweiterung von CollectionType
(die Array
implementiert) definiert ist:
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
Darüber hinaus wird das Finden des ersten Elements in einem Array, das ein Prädikat erfüllt, durch eine andere Erweiterung von unterstützt CollectionType
:
let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil
Beachten Sie, dass diese beiden Funktionen find
wie zuvor optionale Werte zurückgeben .
Update für Swift 3.0:
Beachten Sie, dass sich die Syntax von indexOf geändert hat. Für Artikel, die Ihren Anforderungen entsprechen, können Equatable
Sie Folgendes verwenden:
let indexOfA = arr.index(of: "a")
Eine ausführliche Dokumentation der Methode finden Sie unter https://developer.apple.com/reference/swift/array/1689674-index
Für Array-Elemente, die nicht den Equatable
Anforderungen entsprechen, müssen Sie Folgendes verwenden index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Update für Swift 4.2:
Wird mit Swift 4.2 index
nicht mehr verwendet, sondern zur besseren Verdeutlichung in firstIndex
und getrennt lastIndex
. Je nachdem, ob Sie nach dem ersten oder dem letzten Index des Artikels suchen:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
Ihrer Information : Wenn Sie ein Array von Strukturen verwenden, die Sie selbst definiert haben, muss Ihre Struktur demEquatable
Protokoll entsprechen.tl; dr:
Für Klassen suchen Sie möglicherweise:
Vollständige Antwort:
Ich denke, es ist erwähnenswert, dass Sie mit Referenztypen (
class
) möglicherweise einen Identitätsvergleich durchführen möchten. In diesem Fall müssen Sie nur den===
Identitätsoperator beim Schließen des Prädikats verwenden:Swift 5, Swift 4.2:
Beachten Sie, dass die obige Syntax die Syntax für abschließende Verschlüsse verwendet und Folgendes entspricht:
Swift 4 / Swift 3 - die Funktion, die früher aufgerufen wurde
index
Swift 2 - die Funktion, die früher aufgerufen wurde
indexOf
* Beachten Sie den relevanten und nützlichen Kommentar von paulbailey zu
class
implementierten TypenEquatable
, bei dem Sie überlegen müssen, ob Sie mit===
( Identitätsoperator ) oder==
( Gleichheitsoperator ) vergleichen sollten. Wenn Sie sich für eine Übereinstimmung mit entscheiden,==
können Sie einfach die von anderen vorgeschlagene Methode verwenden (people.firstIndex(of: person1)
).quelle
Person
dasEquatable
Protokoll implementiert wäre, wäre dies nicht erforderlich.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
meine Struktur ist ... eine Idee?structs
(undenums
) sind Werttypen, keine Referenztypen. Nur Referenztypen (z. B.class
) haben eine Identitätsvergleichslogik (===
). Schauen Sie sich die anderen Antworten an, um zu erfahren, was Sie tun sollenstructs
(im Grunde verwenden Sie einfach diearray.index(of: myStruct)
, um sicherzustellen, dass der TypmyStruct
mitEquatable
(==
) übereinstimmt ).Sie können
filter
ein Array mit einem Abschluss erstellen:Und Sie können ein Array zählen:
Sie können also feststellen, ob ein Array Ihr Element enthält, indem Sie diese kombinieren:
Wenn Sie die Position finden wollen, sehe ich keinen ausgefallenen Weg, aber Sie können es auf jeden Fall so machen:
BEARBEITEN
Während wir gerade dabei sind, wollen wir für eine lustige Übung
Array
einefind
Methode erweitern:Jetzt können wir das tun:
quelle
Array
um einefind
Methode erweitere, die das tut, was Sie wollen. Ich weiß noch nicht, ob dies eine gute Praxis ist, aber es ist ein ordentliches Experiment.enumerate
damit es nicht mehr gilt, aber Sie haben absolut Recht.Swift 5
Beispiel 1
Beispiel2
quelle
Funktioniert zwar
indexOf()
einwandfrei, gibt jedoch nur einen Index zurück.Ich suchte nach einer eleganten Möglichkeit, eine Reihe von Indizes für Elemente zu erhalten, die bestimmte Bedingungen erfüllen.
So geht's:
Swift 3:
Swift 2:
quelle
Für benutzerdefinierte Klassen müssen Sie das Equatable-Protokoll implementieren.
quelle
Update für Swift 2:
Swift 1:
Wenn Sie nur überprüfen möchten, ob ein Element in einem Array enthalten ist, dh nur einen booleschen Indikator erhalten, verwenden Sie
contains(sequence, element)
anstelle vonfind(array, element)
:Siehe Beispiel unten:
quelle
in Swift 4.2
.index (wo :) wurde in .firstIndex (wo :) geändert
quelle
Swift 4. Wenn Ihr Array Elemente vom Typ [String: AnyObject] enthält. Um den Index des Elements zu finden, verwenden Sie den folgenden Code
Oder Wenn Sie einen Index auf der Grundlage eines Schlüssels aus dem Wörterbuch finden möchten. Hier enthält das Array Objekte der Modellklasse und ich stimme mit der ID-Eigenschaft überein.
quelle
Swift 2.1
Swift 3
quelle
let array
? Die Verwendung vonself
ist ebenfalls fraglich.Wenn Sie in Swift 4 Ihr DataModel-Array durchlaufen, stellen Sie sicher, dass Ihr Datenmodell dem Equatable Protocol entspricht, implementieren Sie die Methode lhs = rhs, und nur dann können Sie beispielsweise ".index (of") verwenden
Und dann,
quelle
Array
Enthält in Swift 2 (mit Xcode 7) eineindexOf
vomCollectionType
Protokoll bereitgestellte Methode . (Tatsächlich zweiindexOf
Methoden - eine, die Gleichheit verwendet, um einem Argument zu entsprechen, und eine andere , die einen Abschluss verwendet.)Vor Swift 2 gab es für generische Typen wie Sammlungen keine Möglichkeit, Methoden für die daraus abgeleiteten konkreten Typen (wie Arrays) bereitzustellen. In Swift 1.x ist "index of" eine globale Funktion ... und es wurde auch umbenannt. In Swift 1.x wird diese globale Funktion aufgerufen
find
.Es ist auch möglich (aber nicht erforderlich), die
indexOfObject
Methode vonNSArray
... oder eine andere, komplexere Suchmethode von Foundation zu verwenden, die keine Entsprechungen in der Swift-Standardbibliothek enthält. Nurimport Foundation
(oder ein anderes Modul , dass transitively importiert Foundation), werfen Sie IhreArray
zuNSArray
, und Sie können auf die vielen Suchmethoden verwendenNSArray
.quelle
Jede dieser Lösungen funktioniert für mich
Dies ist die Lösung, die ich für Swift 4 habe:
quelle
Sie können auch die Funktionsbibliothek Dollar verwenden, um einen Index für ein Array als solches zu erstellen. Http://www.dollarswift.org/#indexof-indexof
quelle
Wenn Sie noch in Swift 1.x arbeiten
dann versuche es,
quelle
Für SWIFT 3 können Sie eine einfache Funktion verwenden
Dies gibt die Nummer Position, so dass Sie wie verwenden können
Ich hoffe, nützlich zu sein
quelle
SWIFT 4
Angenommen, Sie möchten eine Nummer aus dem Array cardButtons in cardNumber speichern. Dies können Sie folgendermaßen tun:
Absender ist der Name Ihrer Schaltfläche
quelle
Swift 4
Für Referenztypen:
quelle
Verwenden Sie in Swift 4/5 "firstIndex", um den Index zu finden.
quelle
Falls jemand dieses Problem hat
Aber mach das
dann
quelle
Zum
(>= swift 4.0)
Es ist ziemlich einfach. Betrachten Sie das folgende
Array
Objekt.Um den Index des Elements zu erhalten
rose
, müssen Sie lediglich Folgendes tun:Hinweis:
Array.index(of:)
gibt ein zurückOptional<Int>
.nil
impliziert, dass das Element nicht im Array vorhanden ist.Möglicherweise möchten Sie den zurückgegebenen Wert zwangsweise auspacken oder ein verwenden
if-let
, um das optionale zu umgehen .quelle
Verwenden Sie einfach die firstIndex-Methode.
quelle