J'essaie de trouver un item index
en recherchant un list
. Est-ce que quelqu'un sait comment faire ça?
Je vois qu'il y en a list.StartIndex
et list.EndIndex
je veux quelque chose comme le python list.index("text")
.
Comme swift est à certains égards plus fonctionnel qu'orienté objet (et les tableaux sont des structures, pas des objets), utilisez la fonction "find" pour opérer sur le tableau, qui retourne une valeur facultative, alors soyez prêt à gérer une valeur nulle:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
Mise à jour pour Swift 2.0:
L'ancienne find
fonction n'est plus supportée avec Swift 2.0!
Avec Swift 2.0, Array
gagne la capacité de trouver l'index d'un élément en utilisant une fonction définie dans une extension de CollectionType
(qui Array
implémente):
let arr = ["a","b","c"]
let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil
De plus, la recherche du premier élément d'un tableau remplissant un prédicat est prise en charge par une autre extension de 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
Notez que ces deux fonctions renvoient des valeurs facultatives, comme find
précédemment.
Mise à jour pour Swift 3.0:
Notez que la syntaxe de indexOf a changé. Pour les articles conformes à Equatable
vous pouvez utiliser:
let indexOfA = arr.index(of: "a")
Une documentation détaillée de la méthode peut être trouvée à https://developer.apple.com/reference/swift/array/1689674-index
Pour les éléments de tableau non conformes, Equatable
vous devrez utiliser index(where:)
:
let index = cells.index(where: { (item) -> Bool in
item.foo == 42 // test if this is the item you're looking for
})
Mise à jour pour Swift 4.2:
Avec Swift 4.2, index
n'est plus utilisé mais est séparé en firstIndex
et lastIndex
pour une meilleure clarification. Donc, selon que vous recherchez le premier ou le dernier index de l'article:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
indexOf
sur un tableau de structures que vous avez défini vous-même, votre structure doit respecter leEquatable
protocole.tl; dr:
Pour les cours, vous cherchez peut-être:
Réponse complète:
Je pense qu'il vaut la peine de mentionner qu'avec les types de référence (
class
), vous voudrez peut-être effectuer une comparaison d' identité , auquel cas il vous suffit d'utiliser l'===
opérateur d'identité dans la fermeture du prédicat:Swift 5, Swift 4.2:
Notez que la syntaxe ci-dessus utilise la syntaxe des fermetures finales et équivaut à:
Swift 4 / Swift 3 - la fonction qui s'appelait auparavant
index
Swift 2 - la fonction qui s'appelait autrefois
indexOf
* Notez le commentaire pertinent et utile de paulbailey sur les
class
types qui implémententEquatable
, où vous devez déterminer si vous devez comparer en utilisant===
( opérateur d' identité ) ou==
( opérateur d' égalité ). Si vous décidez de faire correspondre l'utilisation==
, vous pouvez simplement utiliser la méthode suggérée par les autres (people.firstIndex(of: person1)
).la source
Person
implémenté leEquatable
protocole, cela ne serait pas nécessaire.Binary operator '===' cannot be applied to operands of type '_' and 'Post'
,Post
est mon struct ... une idée?structs
(etenums
) sont des types de valeur, pas des types de référence. Seuls les types de référence (par exempleclass
) ont une logique de comparaison d'identité (===
). Consultez les autres réponses pour savoir quoi fairestructs
(en gros, vous utilisez simplement learray.index(of: myStruct)
, en vous assurant que le type demyStruct
est conforme àEquatable
(==
)).Vous pouvez
filter
un tableau avec une fermeture:Et vous pouvez compter un tableau:
Vous pouvez donc déterminer si un tableau inclut votre élément en combinant ces éléments:
Si vous voulez trouver le poste, je ne vois pas de façon fantaisiste, mais vous pouvez certainement le faire comme ceci:
ÉDITER
Pendant que nous y sommes, pour un exercice amusant, développons
Array
unefind
méthode:Maintenant, nous pouvons le faire:
la source
Array
pour avoir unefind
méthode qui fait ce que vous voulez. Je ne sais pas encore si c'est une bonne pratique, mais c'est une expérience intéressante.enumerate
afin qu'il ne s'applique plus, mais vous avez absolument raison.Swift 5
Exemple 1
Exemple2
la source
Bien qu'il
indexOf()
fonctionne parfaitement, il ne renvoie qu'un seul index.Je cherchais un moyen élégant d'obtenir un tableau d'index pour des éléments qui satisfont à certaines conditions.
Voici comment cela peut être fait:
Swift 3:
Swift 2:
la source
Pour la classe personnalisée, vous devez implémenter le protocole Equatable.
la source
Mise à jour pour Swift 2:
Swift 1:
Si vous cherchez simplement à vérifier si un élément est contenu dans un tableau, c'est-à-dire, obtenez simplement un indicateur booléen, utilisez à la
contains(sequence, element)
place defind(array, element)
:Voir l'exemple ci-dessous:
la source
dans Swift 4.2
.index (où :) a été remplacé par .firstIndex (où :)
la source
Swift 4. Si votre tableau contient des éléments de type [String: AnyObject]. Donc, pour trouver l'index de l'élément, utilisez le code ci-dessous
Ou Si vous souhaitez trouver l'index sur la base de la clé du dictionnaire. Ici, le tableau contient les objets de la classe Model et je fais correspondre la propriété id.
la source
Swift 2.1
Swift 3
la source
let array
? L'utilisation deself
est également discutable.Dans Swift 4 , si vous parcourez votre tableau DataModel, assurez-vous que votre modèle de données est conforme au protocole Equatable, implémentez la méthode lhs = rhs, et alors seulement vous pouvez utiliser ".index (of". Par exemple
Et alors,
la source
Dans Swift 2 (avec Xcode 7),
Array
inclut uneindexOf
méthode fournie par leCollectionType
protocole. (En fait, deuxindexOf
méthodes: une qui utilise l'égalité pour faire correspondre un argument et une autre qui utilise une fermeture.)Avant Swift 2, il n'existait aucun moyen pour les types génériques comme les collections de fournir des méthodes pour les types concrets qui en dérivent (comme les tableaux). Donc, dans Swift 1.x, "index de" est une fonction globale ... Et il a également été renommé, donc dans Swift 1.x, cette fonction globale est appelée
find
.Il est également possible (mais pas nécessaire) d'utiliser la
indexOfObject
méthode deNSArray
... ou l'une des autres méthodes de recherche plus sophistiquées de Foundation qui n'ont pas d'équivalents dans la bibliothèque standard de Swift. Justeimport Foundation
(ou un autre module qui importe transitoirement Foundation), transformez votreArray
enNSArray
, et vous pouvez utiliser les nombreuses méthodes de recherche surNSArray
.la source
N'importe laquelle de cette solution fonctionne pour moi
Voici la solution que j'ai pour Swift 4:
la source
Vous pouvez également utiliser la bibliothèque fonctionnelle Dollar pour faire un indexOf sur un tableau en tant que tel http://www.dollarswift.org/#indexof-indexof
la source
Si vous travaillez toujours dans Swift 1.x
Alors essaye,
la source
Pour SWIFT 3, vous pouvez utiliser une fonction simple
Cela donnera la position du numéro, vous pouvez donc utiliser comme
J'espère être utile
la source
SWIFT 4
Supposons que vous souhaitiez stocker un numéro du tableau appelé cardButtons dans cardNumber, vous pouvez le faire de cette façon:
l'expéditeur est le nom de votre bouton
la source
Swift 4
Pour les types de référence:
la source
Dans Swift 4/5, utilisez "firstIndex" pour trouver l'index.
la source
Si quelqu'un a ce problème
je fais ça
puis
la source
Pour
(>= swift 4.0)
C'est assez simple. Considérez l'
Array
objet suivant .Pour obtenir l'index de l'élément
rose
, il vous suffit de:Remarque:
Array.index(of:)
renvoie unOptional<Int>
.nil
implique que l'élément n'est pas présent dans le tableau.Vous pourriez vouloir déballer de force la valeur retournée ou utiliser un
if-let
pour contourner l'option.la source
Utilisez simplement la méthode firstIndex.
la source