Wie kann ich in Swift überprüfen, ob ein Element in einem Array vorhanden ist? Xcode hat keine Vorschläge für contain
, include
oderhas
, und eine schnelle Suche im Buch ergab nichts. Irgendeine Idee, wie man das überprüft? Ich weiß, dass es eine Methode find
gibt, die die Indexnummer zurückgibt, aber gibt es eine Methode, die einen Booleschen Wert wie den von Ruby zurückgibt #include?
?
Beispiel für das, was ich brauche:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
ist nicht gut genugAntworten:
Swift 2, 3, 4, 5:
contains()
ist eine Protokollerweiterungsmethode vonSequenceType
(für Sequenzen vonEquatable
Elementen) und keine globale Methode wie in früheren Versionen.Bemerkungen:
contains()
Methode erfordert, dass die Sequenzelemente dasEquatable
Protokoll übernehmen, z . B. Andrews Antwort .NSObject
Unterklasse sind, müssen Sie diese überschreibenisEqual:
, siehe NSObject-Unterklasse in Swift: hash vs hashValue, isEqual vs == .contains()
Methode, bei der die Elemente nicht gleichwertig sein müssen und ein Prädikat als Argument verwendet wird. Siehe z. B. Kurzschrift, um zu testen, ob ein Objekt in einem Array für Swift vorhanden ist. .Schnelle ältere Versionen:
quelle
Equatable
Protokoll entsprechen (wasDictionary<String, AnyObject>
nicht der Fall ist). Es gibt eine zweite Variante,contains()
die ein Prädikat annimmt (vergleiche stackoverflow.com/questions/29679486/… ). Vielleicht können Sie das verwenden, z. B.if contains(array, { $0 == dict } ) ...
Für diejenigen, die hierher gekommen sind, um ein Objekt zu finden und aus einem Array zu entfernen:
Schnell 1
Swift 2
Swift 3, 4
Swift 5.2
quelle
Verwenden Sie diese Erweiterung:
Benutzen als:
Aktualisiert für Swift 2/3
Beachten Sie, dass ab Swift 3 (oder sogar 2) die Erweiterung nicht mehr erforderlich ist, da die globale
contains
Funktion in ein Paar von Erweiterungsmethoden umgewandelt wurdeArray
, mit denen Sie Folgendes ausführen können:quelle
Wenn Sie überprüfen, ob eine Instanz einer benutzerdefinierten Klasse oder Struktur in einem Array enthalten ist, müssen Sie das Equatable- Protokoll implementieren , bevor Sie .contains (myObject) verwenden können.
Zum Beispiel:
dann können Sie tun:
Tipp : Die == Überschreibung sollte auf globaler Ebene erfolgen und nicht in Ihrer Klasse / Struktur
quelle
Ich habe Filter verwendet.
Wenn Sie möchten, können Sie dies komprimieren
Ich hoffe, das hilft.
Update für Swift 2
Hurra für Standardimplementierungen!
quelle
(Swift 3)
Überprüfen Sie, ob ein Element in einem Array vorhanden ist (das einige Kriterien erfüllt), und fahren Sie in diesem Fall mit dem ersten solchen Element fort
Wenn die Absicht ist:
Dann eine Alternative zu
contains(_:)
als blueprintedSequence
istfirst(where:)
vonSequence
:In diesem erfundenen Beispiel mag seine Verwendung albern erscheinen, aber es ist sehr nützlich, wenn Arrays nicht grundlegender Elementtypen nach der Existenz von Elementen abgefragt werden, die eine bestimmte Bedingung erfüllen. Z.B
Alle verketteten Operationen mit
.filter { ... some condition }.first
können vorteilhafterweise durch ersetzt werdenfirst(where:)
. Letzteres zeigt die Absicht besser und hat Leistungsvorteile gegenüber möglichen nicht faulen Geräten von.filter
, da diese das gesamte Array passieren, bevor das (mögliche) erste Element, das den Filter passiert, extrahiert wird.Überprüfen Sie, ob ein Element in einem Array vorhanden ist (das einige Kriterien erfüllt), und entfernen Sie in diesem Fall das erste derartige Element
Ein Kommentar unter Fragen:
Ein ähnlicher Anwendungsfall wie oben besteht darin , das erste Element zu entfernen, das ein bestimmtes Prädikat erfüllt. Zu diesem Zweck kann die
index(where:)
Methode vonCollection
(die für die Array-Sammlung leicht verfügbar ist) verwendet werden, um den Index des ersten Elements zu finden, das das Prädikat erfüllt, wonach der Index mit derremove(at:)
Methode vonArray
to (möglich; vorausgesetzt, dass er existiert) verwendet werden kann. Entfernen Sie dieses Element.Wenn Sie das Element aus dem Array entfernen und damit arbeiten möchten , wenden Sie die
Optional
folgendemap(_:)
Methode an : s , um das Ergebnis von bedingt (für die.some(...)
Rückgabe vonindex(where:)
) zu verwendenindex(where:)
, um das entfernte Element aus dem Array zu entfernen und zu erfassen (innerhalb einer optionalen Bindungsklausel). .Beachten Sie, dass es sich bei dem erfundenen Beispiel oben um einfache Werttypen (
String
Instanzen) handelt. Die Verwendung eines Prädikats zum Auffinden eines bestimmten Elements ist daher etwas übertrieben , da wir die Gleichheit möglicherweise einfach mit der einfacherenindex(of:)
Methode testen , wie in der Antwort von @ DogCoffee gezeigt . Wenn Sie jedoch den obigen Find-and-Remove-Ansatz auf dasPerson
Beispiel anwenden , ist die Verwendungindex(where:)
mit einem Prädikat angemessen (da wir nicht mehr auf Gleichheit testen, sondern ein angegebenes Prädikat erfüllen).quelle
Der einfachste Weg, dies zu erreichen, ist die Verwendung eines Filters für das Array.
result
hat das gefundene Element, wenn es existiert, und ist leer, wenn das Element nicht existiert. Wennresult
Sie also einfach überprüfen, ob es leer ist, können Sie feststellen, ob das Element im Array vorhanden ist. Ich würde folgendes verwenden:quelle
let result = elements.filter { $0==5 }.first
sollten Sie das erreichen, wonach Sie suchen.Swift 4/5
Eine andere Möglichkeit, dies zu erreichen, ist die Filterfunktion
quelle
Ab Swift 2.1 können NSArrays
containsObject
wie folgt verwendet werden:quelle
Nur für den Fall, dass jemand versucht herauszufinden, ob a
indexPath
zu den ausgewählten gehört (wie in aUICollectionView
oderUITableView
cellForItemAtIndexPath
Funktionen):quelle
Array
Überprüfen Sie das Vorhandensein von Elementen
Elementindex abrufen
Elementanzahl abrufen
quelle
Hier ist meine kleine Erweiterung, die ich gerade geschrieben habe, um zu überprüfen, ob mein Delegatenarray ein Delegatenobjekt enthält oder nicht ( Swift 2 ). :) Es funktioniert auch mit Werttypen wie einem Zauber.
Wenn Sie eine Idee haben, wie Sie diesen Code optimieren können, lassen Sie es mich einfach wissen.
quelle
Wenn der Benutzer bestimmte Array-Elemente findet, verwenden Sie den folgenden Code wie den ganzzahligen Wert.
quelle
Schnell
Wenn Sie kein Objekt verwenden, können Sie diesen Code für enthält verwenden.
Wenn Sie NSObject Class in Swift verwenden. Diese Variablen entsprechen meiner Anforderung. Sie können für Ihre Anforderung ändern.
Dies gilt für denselben Datentyp.
Wenn Sie AnyObject eingeben möchten.
Voller Zustand
quelle
Wie wäre es mit einer Hash-Tabelle für diesen Job?
Erstellen Sie zunächst eine generische Funktion "Hash Map", um das Sequenzprotokoll zu erweitern.
Diese Erweiterung funktioniert, solange die Elemente im Array mit Hashable übereinstimmen, z. B. Ganzzahlen oder Zeichenfolgen. Hier ist die Verwendung ...
Aber jetzt konzentrieren wir uns nur darauf, ob sich das Element im Array befindet.
quelle
Swift 4.2 + Mit
der folgenden Funktion können Sie leicht überprüfen, ob Ihre Instanz ein Array ist oder nicht.
Sogar Sie können wie folgt darauf zugreifen. Sie erhalten,
nil
wenn das Objekt kein Array wäre.quelle