Hat Swift so etwas wie _.findWhere in Underscore.js?
Ich habe ein Array von Strukturen vom Typ T
und möchte überprüfen, ob das Array ein Strukturobjekt enthält, dessen name
Eigenschaft gleich ist Foo
.
Versucht zu verwenden find()
und filter()
aber sie funktionieren nur mit primitiven Typen, zB String
oder Int
. Wirft einen Fehler über die Nichteinhaltung des Equitable
Protokolls oder ähnliches.
Antworten:
FWIW, wenn Sie keine benutzerdefinierte Funktion oder Erweiterung verwenden möchten, können Sie:
Dies erzeugt dann
name
zuerst ein Arrayfind
.Wenn Sie ein großes Array haben, möchten Sie vielleicht Folgendes tun:
oder vielleicht:
quelle
SWIFT 5
Überprüfen Sie, ob das Element vorhanden ist
Holen Sie sich das Element
Holen Sie sich das Element und seinen Versatz
Holen Sie sich den Offset
quelle
$0.name == "foo"
eine Operation und$0.name == "boo"
eine andere OperationSie können die
index
fürArray
ein Prädikat verfügbare Methode verwenden ( siehe Apples Dokumentation hier ).Für Ihr spezielles Beispiel wäre dies:
Swift 5.0
Swift 3.0
Swift 2.0
quelle
Swift 3
Wenn Sie das Objekt benötigen, verwenden Sie:
(Wenn Sie mehr als ein Objekt mit dem Namen "Foo" haben,
first
wird das erste Objekt aus einer nicht angegebenen Reihenfolge zurückgegeben.)quelle
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Sie können das Array filtern und dann einfach das erste Element auswählen, wie unter Objekt mit Eigenschaft im Array suchen gezeigt .
Oder Sie definieren eine benutzerdefinierte Erweiterung
Anwendungsbeispiel:
In Swift 3 können Sie die vorhandene
first(where:)
Methode verwenden (wie in einem Kommentar erwähnt ):quelle
array.lazy.filter( predicate ).first
? Wie effizient ist .lazy für kleine Arrays?filter
ist immer,O(n)
während imfindFirstMatching
nur das schlechteste Szenario ist (wenn das gesuchte Element das letzte ist oder überhaupt nicht im Array). 2.filter
erstellt ein völlig neues Array gefilterter Elemente, während dasfindFirstMatching
gerade angeforderte Element zurückgegeben wird.Swift 3.0
Swift 2.1
Das Filtern in Objekteigenschaften wird jetzt in Swift 2.1 unterstützt. Sie können Ihr Array basierend auf einem beliebigen Wert der Struktur oder Klasse filtern. Hier ist ein Beispiel
ODER
quelle
Swift 4 ,
Eine andere Möglichkeit, dies mithilfe der Filterfunktion zu erreichen:
quelle
Swift 3
Sie können index (where :) in Swift 3 verwenden
Beispiel
quelle
$0.name == "Foo"
?Swift 3
quelle
Swift 2 oder höher
Sie können eine Funktion "Element suchen" in einer einzigen Zeile kombinieren
indexOf
undmap
schreiben.Die Verwendung von
filter
+first
sieht sauberer aus,filter
wertet jedoch alle Elemente im Array aus.indexOf
+map
sieht kompliziert aus, aber die Auswertung stoppt, wenn die erste Übereinstimmung im Array gefunden wird. Beide Ansätze haben Vor- und Nachteile.quelle
Verwendung
contains
:Oder Sie können versuchen, worauf Martin Sie in den Kommentaren hingewiesen hat, und es erneut
filter
versuchen: Objekt mit Eigenschaft in Array suchen .quelle
item
dem Typ des Elements im Array. Ich habe jedoch nur einen Titel vonview.annotation.title
. Ich muss Elemente im Array anhand dieses Titels vergleichen.if contains(yourArray, view.annotation.title) { // code goes here }
.Eine andere Möglichkeit, Zugriff auf array.index (von: Any) zu erhalten, besteht darin, Ihr Objekt zu deklarieren
quelle
Verwenden Sie für Swift Dollar , Lo-Dash oder Underscore.js:
quelle
Swift 3:
Sie können die in Swifts integrierte Funktionalität verwenden, um benutzerdefinierte Objekte in einem Array zu finden.
Zuerst müssen Sie sicherstellen, dass Ihr benutzerdefiniertes Objekt dem: Equatable-Protokoll entspricht .
Mit der Ihrem Objekt hinzugefügten Equatable-Funktionalität zeigt Swift jetzt zusätzliche Eigenschaften an, die Sie für ein Array verwenden können:
quelle
Für Swift 3
quelle
Wenn wir zum Beispiel ein Array von Zahlen hätten:
Wir konnten die erste ungerade Zahl wie folgt finden:
Dadurch wird 4 als optionale Ganzzahl zurückgesendet, da sich die erste ungerade Zahl (9) am Index vier befindet.
quelle