Swift a-t-il quelque chose comme _.findWhere dans Underscore.js?
J'ai un tableau de structures de type T
et je voudrais vérifier si array contient un objet struct dont la name
propriété est égale à Foo
.
J'ai essayé d'utiliser find()
et filter()
mais ils ne fonctionnent qu'avec des types primitifs, par exemple String
ou Int
. Lève une erreur concernant le non-respect du Equitable
protocole ou quelque chose comme ça.
Réponses:
FWIW, si vous ne souhaitez pas utiliser de fonction ou d'extension personnalisée, vous pouvez:
Cela génère
name
d'abord le tableau, puis àfind
partir de celui-ci.Si vous avez un énorme tableau, vous pouvez faire:
ou peut-être:
la source
SWIFT 5
Vérifier si l'élément existe
Obtenez l'élément
Obtenir l'élément et son décalage
Obtenez le décalage
la source
$0.name == "foo"
effectue une opération et$0.name == "boo"
une autre opérationVous pouvez utiliser la
index
méthode disponible surArray
avec un prédicat ( voir la documentation Apple ici ).Pour votre exemple spécifique, ce serait:
Swift 5.0
Swift 3.0
Swift 2.0
la source
Swift 3
Si vous avez besoin de l'objet, utilisez:
(Si vous avez plus d'un objet nommé "Foo"
first
, le premier objet retournera d'un ordre non spécifié)la source
array.first {$0.name == "Foo"}
array.first(where: {$0.name == "Foo"})
Vous pouvez filtrer le tableau, puis choisir simplement le premier élément, comme indiqué dans Rechercher un objet avec une propriété dans un tableau .
Ou vous définissez une extension personnalisée
Exemple d'utilisation:
Dans Swift 3, vous pouvez utiliser la
first(where:)
méthode existante (comme mentionné dans un commentaire ):la source
array.lazy.filter( predicate ).first
t-il? Quelle est l'efficacité de .lazy pour les petits tableaux?filter
est toujoursO(n)
alors que dans lefindFirstMatching
c'est seulement dans le pire des scénarios (lorsque l'élément que vous recherchez est le dernier ou pas du tout dans le tableau). 2.filter
crée un tout nouveau tableau d'éléments filtrés tandis que lefindFirstMatching
renvoie simplement l'élément demandé.Swift 3.0
Swift 2.1
Le filtrage dans les propriétés des objets est désormais pris en charge dans swift 2.1. Vous pouvez filtrer votre tableau en fonction de n'importe quelle valeur de la structure ou de la classe, voici un exemple
OU
la source
Swift 4 ,
Une autre façon d'y parvenir en utilisant la fonction de filtre,
la source
Swift 3
vous pouvez utiliser index (où :) dans Swift 3
exemple
la source
$0.name == "Foo"
?Swift 3
la source
Swift 2 ou version ultérieure
Vous pouvez combiner
indexOf
etmap
écrire une fonction "find element" sur une seule ligne.L'utilisation de
filter
+first
semble plus propre, maisfilter
évalue tous les éléments du tableau.indexOf
+map
semble compliqué, mais l'évaluation s'arrête lorsque la première correspondance du tableau est trouvée. Les deux approches ont des avantages et des inconvénients.la source
Utilisez
contains
:Ou vous pouvez essayer ce que Martin vous a indiqué dans les commentaires et
filter
réessayer: Rechercher un objet avec une propriété dans un tableau .la source
item
est du même type que l'élément du tableau. Cependant, tout ce que j'ai est juste un titreview.annotation.title
. J'ai besoin de comparer les éléments du tableau par ce titre.if contains(yourArray, view.annotation.title) { // code goes here }
.Une autre façon d'accéder à array.index (of: Any) est de déclarer votre objet
la source
Utilisez Dollar qui est Lo-Dash ou Underscore.js pour Swift:
la source
Swift 3:
Vous pouvez utiliser la fonctionnalité intégrée Swifts pour rechercher des objets personnalisés dans un tableau.
Vous devez d'abord vous assurer que votre objet personnalisé est conforme au protocole : Equatable .
Avec la fonctionnalité Equatable ajoutée à votre objet, Swift vous montrera désormais des propriétés supplémentaires que vous pouvez utiliser sur un tableau:
la source
Pour Swift 3,
la source
Par exemple, si nous avions un tableau de nombres:
Nous pourrions trouver le premier nombre impair comme ceci:
Cela renverra 4 comme entier facultatif, car le premier nombre impair (9) est à l'index quatre.
la source