Existe-t-il une fonction que je peux utiliser pour parcourir un tableau et avoir à la fois un index et un élément, comme l'énumération de Python?
for index, element in enumerate(list):
...
arrays
swift
enumeration
penseur3
la source
la source
enumerate
?enumerating
pour Swift 4. Excitant!for (index, element) in
lors de l'utilisationenumerated
est trompeur. devrait êtrefor (offset, element) in
Swift 5 fournit une méthode appelée
enumerated()
pourArray
.enumerated()
a la déclaration suivante:Dans les cas les plus simples, vous pouvez utiliser
enumerated()
une boucle for. Par exemple:Notez cependant que vous n'êtes pas limité à une utilisation
enumerated()
avec une boucle for. En fait, si vous prévoyez d'utiliserenumerated()
avec une boucle for pour quelque chose de similaire au code suivant, vous le faites mal:Une façon plus rapide de le faire est:
Comme alternative, vous pouvez également utiliser
enumerated()
avecmap
:De plus, bien qu’il ait limites , il
forEach
peut être un bon remplacement d'une boucle for:En utilisant
enumerated()
etmakeIterator()
, vous pouvez même itérer manuellement sur votreArray
. Par exemple:la source
enumerate
?À partir de Swift 2, la fonction énumération doit être appelée sur la collection comme suit:
la source
J'ai trouvé cette réponse en cherchant un moyen de le faire avec un dictionnaire , et il s'avère qu'il est assez facile de l'adapter, il suffit de passer un tuple pour l'élément.
la source
Vous pouvez simplement utiliser une boucle d'énumération pour obtenir le résultat souhaité:
Swift 2:
Swift 3 & 4:
Ou vous pouvez simplement passer par une boucle for pour obtenir le même résultat:
J'espère que cela aide.
la source
Énumération de base
ou avec Swift 3 ...
Énumérer, filtrer et mapper
Cependant, j'utilise le plus souvent enumerate en combinaison avec map ou filter. Par exemple, en opérant sur quelques tableaux.
Dans ce tableau, je voulais filtrer les éléments impairs ou même indexés et les convertir d'Ints en Doubles. Ainsi,
enumerate()
vous obtenez l'index et l'élément, puis le filtre vérifie l'index, et enfin, pour me débarrasser du tuple résultant, je le mappe uniquement sur l'élément.la source
Utiliser des
.enumerate()
œuvres, mais il ne fournit pas le véritable index de l'élément; il ne fournit qu'un Int commençant par 0 et incrémenté de 1 pour chaque élément successif. Cela n'est généralement pas pertinent, mais il existe un risque de comportement inattendu lorsqu'il est utilisé avec leArraySlice
type. Prenez le code suivant:C'est un exemple quelque peu artificiel, et ce n'est pas un problème courant dans la pratique, mais je pense que cela vaut la peine de savoir que cela peut se produire.
la source
it does not actually provide the true index of the element; it only provides an Int beginning with 0 and incrementing by 1 for each successive element
Oui, c'est pourquoi cela s'appelle énumérer . De plus, la tranche n'est pas un tableau, donc pas surprenant qu'elle se comporte différemment. Il n'y a pas de bug ici - tout est par conception. :)filter
premier?A partir de Swift 3, c'est
la source
Pour être complet, vous pouvez simplement parcourir vos indices de tableau et utiliser l'indice pour accéder à l'élément à l'index correspondant:
Utilisation de forEach
Utilisation de la
enumerated()
méthode de collecte . Notez qu'il retourne une collection de tuples avec leoffset
et leelement
:en utilisant forEach:
Ceux-ci imprimeront
Si vous avez besoin de l'index du tableau (pas du décalage) et de son élément, vous pouvez étendre Collection et créer votre propre méthode pour obtenir les éléments indexés:
Une autre implémentation possible comme suggéré par Alex est de compresser les index de collection avec ses éléments:
Essai:
Ce sera p [rint
la source
enumeratedIndices
en bouclant aveczip(self.indices, self)
for element in zip(indices, self) { try body(element) }
. Btw je n'aime pas le nom que j'ai choisi,indexedElements
pourrait mieux décrire ce qu'il faitfor
boucle fonctionne, mais aussizip(self.indices, self) .forEach(body)
forEach
fait une boucle for dans les coulisses. Je préfère rester simple et simple github.com/apple/swift/blob/master/stdlib/public/core/…@inlinable public func forEach( _ body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } }
C'est la formule de boucle d'énumération:
pour plus de détails, vous pouvez vérifier ici .
la source
Personnellement, je préfère utiliser la
forEach
méthode:Vous pouvez également utiliser la version courte:
la source
Xcode 8 et Swift 3: les tableaux peuvent être énumérés à l'aide de
tempArray.enumerated()
Exemple:
console:
la source
Pour ceux qui veulent utiliser
forEach
.Swift 4
Ou
la source
Pour ce que vous voulez faire, vous devez utiliser la
enumerated()
méthode sur votre tableau :la source
Nous avons appelé la fonction énumération pour implémenter ceci. comme
la source