Dans Swift, comment puis-je vérifier si un élément existe dans un tableau? Xcode n'a pas de suggestions pour contain
, include
ou has
, et une recherche rapide à travers le livre n'a rien donné . Une idée comment vérifier cela? Je sais qu'il existe une méthode find
qui renvoie le numéro d'index, mais existe-t-il une méthode qui renvoie un booléen comme Ruby #include?
?
Exemple de ce dont j'ai besoin:
var elements = [1,2,3,4,5]
if elements.contains(5) {
//do something
}
if find(elements, 5) != nil { }
n'est pas assez bon?Réponses:
Swift 2, 3, 4, 5:
contains()
est une méthode d'extension de protocole deSequenceType
(pour les séquences d'Equatable
éléments) et non une méthode globale comme dans les versions précédentes.Remarques:
contains()
méthode nécessite que les éléments de séquence adoptent leEquatable
protocole, comparez par exemple la réponse d'Andrews .NSObject
sous - classe, vous devez remplacerisEqual:
, voir Sous-classe NSObject dans Swift: hash vs hashValue, isEqual vs == .contains()
méthode - plus générale - qui ne nécessite pas que les éléments soient équitables et prend un prédicat comme argument, voir par exemple Shorthand pour tester si un objet existe dans un tableau pour Swift? .Swift anciennes versions:
la source
Equatable
protocole (ce quiDictionary<String, AnyObject>
n'est pas le cas). Il existe une deuxième variantecontains()
qui prend un prédicat (comparer stackoverflow.com/questions/29679486/… ) peut-être que vous pouvez l'utiliser, par exempleif contains(array, { $0 == dict } ) ...
Pour ceux qui sont venus ici à la recherche d'une recherche et supprimer un objet d'un tableau:
Swift 1
Swift 2
Swift 3, 4
Swift 5.2
la source
Utilisez cette extension:
Utilisé comme:
Mis à jour pour Swift 2/3
Notez que depuis Swift 3 (ou même 2), l'extension n'est plus nécessaire car la
contains
fonction globale a été transformée en une paire de méthodes d'extensionArray
, ce qui vous permet de faire l'une des choses suivantes:la source
Si vous vérifiez si une instance d'une classe ou d'une structure personnalisée est contenue dans un tableau, vous devrez implémenter le protocole Equatable avant de pouvoir utiliser .contains (myObject).
Par exemple:
alors vous pouvez faire:
Astuce : la substitution == doit être au niveau global, pas dans votre classe / structure
la source
J'ai utilisé un filtre.
Si vous le souhaitez, vous pouvez le compresser en
J'espère que cela pourra aider.
Mise à jour pour Swift 2
Vive les implémentations par défaut!
la source
(Swift 3)
Vérifiez si un élément existe dans un tableau (remplissant certains critères), et si oui, continuez à travailler avec le premier élément de ce type
Si l'intention est:
Alors une alternative à
contains(_:)
as blueprintedSequence
estfirst(where:)
deSequence
:Dans cet exemple artificiel, son utilisation peut sembler stupide, mais il est très utile si vous interrogez des tableaux de types d'éléments non fondamentaux pour l'existence de tout élément remplissant une condition. Par exemple
Toute opération chaînée utilisant
.filter { ... some condition }.first
peut avantageusement être remplacée parfirst(where:)
. Ce dernier montre mieux l'intention et présente des avantages en termes de performances par rapport aux éventuels appareils non paresseux.filter
, car ceux-ci passeront le tableau complet avant d'extraire le premier élément (possible) passant le filtre.Vérifiez si un élément existe dans un tableau (remplissant certains critères), et si oui, supprimez le premier élément de ce type
Un commentaire ci-dessous interroge:
Un cas d'utilisation similaire à celui ci-dessus consiste à supprimer le premier élément qui remplit un prédicat donné. Pour ce faire, la
index(where:)
méthode deCollection
(qui est facilement disponible pour la collection de tableaux) peut être utilisée pour trouver l'index du premier élément remplissant le prédicat, après quoi l'index peut être utilisé avec laremove(at:)
méthode deArray
(possible; étant donné qu'il existe) supprimer cet élément.Ou, si vous souhaitez supprimer l'élément du tableau et travailler avec , appliquez la méthode
Optional
: smap(_:)
à conditionnellement (pour le.some(...)
retour deindex(where:)
) utiliser le résultat deindex(where:)
pour supprimer et capturer l'élément supprimé du tableau (dans une clause de liaison facultative) .Notez que dans l'exemple artificiel ci-dessus, les membres du tableau sont des types de valeur simples (
String
instances), donc l'utilisation d'un prédicat pour trouver un membre donné est quelque peu exagérée , car nous pourrions simplement tester l'égalité en utilisant laindex(of:)
méthode la plus simple comme indiqué dans la réponse de @ DogCoffee .Person
Cependant, si vous appliquez l'approche find-and-remove ci-dessus à l' exemple, l'utilisationindex(where:)
avec un prédicat est appropriée (puisque nous ne testons plus l'égalité mais pour remplir un prédicat fourni).la source
La façon la plus simple d'y parvenir est d'utiliser un filtre sur le tableau.
result
aura l'élément trouvé s'il existe et sera vide si l'élément n'existe pas. Donc, vérifier simplement siresult
est vide vous dira si l'élément existe dans le tableau. J'utiliserais ce qui suit:la source
let result = elements.filter { $0==5 }.first
devrait accomplir ce que vous cherchez.Swift 4/5
Une autre façon d'y parvenir est avec la fonction de filtre
la source
Depuis Swift 2.1, les NSArrays
containsObject
peuvent être utilisés comme suit :la source
Juste au cas où quelqu'un essaierait de trouver si an
indexPath
est parmi ceux sélectionnés (comme dans aUICollectionView
ouUITableView
cellForItemAtIndexPath
fonctions):la source
Array
Vérifier la présence des éléments
Obtenir l'index des éléments
Obtenir le nombre d'éléments
la source
Voici ma petite extension que je viens d'écrire pour vérifier si mon tableau délégué contient ou non un objet délégué ( Swift 2 ). :) Il fonctionne également avec des types de valeur comme un charme.
Si vous avez une idée comment optimiser ce code, faites-le moi savoir.
la source
si l'utilisateur trouve des éléments de tableau particuliers, utilisez le code ci-dessous comme valeur entière.
la source
Rapide
Si vous n'utilisez pas d'objet, vous pouvez utiliser ce code pour contient.
Si vous utilisez NSObject Class dans swift. Cette variable est selon mes besoins. vous pouvez modifier selon vos besoins.
C'est pour un même type de données.
Si vous souhaitez taper AnyObject.
État complet
la source
qu'en est-il de l'utilisation d'une table de hachage pour le travail, comme ça?
tout d'abord, en créant une fonction générique de "carte de hachage", étendant le protocole de séquence.
Cette extension fonctionnera tant que les éléments du tableau seront conformes à Hashable, comme les entiers ou les chaînes, voici l'utilisation ...
Mais pour l'instant, concentrons-nous juste pour vérifier si l'élément est dans le tableau.
la source
Swift 4.2 +
Vous pouvez facilement vérifier que votre instance est un tableau ou non par la fonction suivante.
Même vous pouvez y accéder comme suit. Vous recevrez
nil
si l'objet ne serait pas un tableau.la source