Ajouter “en” soutien pour itérer sur Swift classes personnalisées
Comme nous le savons, nous pouvons utiliser la for..in
de la boucle pour parcourir à travers Arrays
ou Dictionaries
. Cependant, je voudrais effectuer une itération sur mon propre CustomClass
comme ceci:
for i in CustomClass {
someFunction(i)
}
Quelles opérations/protocoles ne CustomClass
à l'appui pour que cela soit possible?
Vous devez vous connecter pour publier un commentaire.
Dire que vous avez une classe "Voiture" que vous voulez être en mesure de parcourir à l'aide d'une boucle for..in:
La façon la plus simple est d'utiliser AnyGenerator avec les classes comme ceci:
Essayer un travail complet de l'échantillon ajouter les deux classes ci-dessus, puis essayez de les utiliser comme cela, l'ajout d'un couple d'items de test:
Ça y est, simple.
Plus d'infos: http://lillylabs.no/2014/09/30/make-iterable-swift-collection-type-sequencetype
AnyGenerator
. Où en êtes-vous cela?SequenceType
est encore le protocole defor...in
.anyGenerator
n'est pas une faute de frappe. Il est leAnyGenerator<>
classe, et il est leanyGenerator()
usine fonction qui renvoie unAnyGenerator<>
classe avec la fin du bloc après l'appel àanyGenerator()
devenir lenext()
méthode de retour de laAnyGenerator<>
instance. Qui fit fondre mon cerveau pendant un certain temps parce que la documentation de la fonction et la classe ne sont pas dans le même lieu et la classe docs ne pas parler de la fonction de fabrication. Cela peut aussi être pourquoi @metatheoretic a été amené à croireAnyGenerator<>
nécessaire d'être sous-classé.anyGenerator
. Je n'ai pas trouvé son équivalent dans Swift 3.AnyIterator
.Toutes les réponses ci-dessus, peut être un peu délicat. Si vous avez un tableau dans votre classe, que vous voulez parcourir (comme dans @Lee Whitney de réponse), il y a un moyen beaucoup plus simple à mettre en œuvre. Vous avez la classe suivante, CustomClass:
Simple que cela. Testé pour fonctionner dans le dernier Xcode version (6.1 au moment de la rédaction) et iOS 8.1.2. Ce code doit être stable dans les futures versions, cependant.
P. S. Avec les médicaments génériques, vous pouvez facilement faire votre propre Tableau réplique en suivant ce modèle, et seulement de mettre en œuvre les méthodes qui vous voulez.
@Matt Gibson est correct. Cependant, je voudrais ajouter plus d'informations pour référence future.
De Pointe Swift:
Ce code:
Est converti en ceci:
Par conséquent, on doit adopter la Séquence, ce qui donne à la classe
generate()
etnext()
. Voici ces protocoles:For in
états boucles surGeneratorType
, dont il peut éventuellement récupérer à partir d'unSequenceType
. Donc, techniquement, vous devez fournir unGeneratorType
ou unSequenceType
.Qui serait le
SequenceType
protocole et de sesGenerator
protocole.La
SequenceType
protocole dit que la classe doit implémentergenerate()
, qui renvoie à quelque chose qui est conforme à laGenerator
protocole, qui est le bit qui fait tout le boulot; leGenerator
protocole est l'un avec le tout-importantnext()
méthode.Il y a un exemple de mise en oeuvre, afin de permettre
for..in
dans le La WWDC 2014, la vidéo Avancée "Swift" (dans les génériques exemple "Un Simple Générique de la Pile", à partir de la diapositive 183.)Les informations de base sur le protocole à mettre en œuvre pour
for..in
est dans le États section de la documentation, ce qui donne un bref aperçu deSequenceType
etGenerator
Sequence
a été renomméSequenceType
dans Swift 1.0.Accepté la réponse est correcte, et jusqu'à récemment, était la façon de traiter cette question. Toutefois, compte tenu de l'introduction des Extensions de Protocole dans Swift 2.0, plutôt que de la conformité à
SequenceType
et la mise en œuvre defunc generate() -> GeneratorOf<Car>
il y a maintenant une classe de base abstraite qui gère la mise en œuvre de cette fonctionnalité pour vous appeléAnyGenerator<T>
(voir Apple docs) depuisGeneratorOf<T>
n'existe plus.Ce que cela signifie est que vous pouvez tout simplement sous-classe de cette classe de base abstraite, et en faisant faire, hériter de toutes les fonctionnalités du protocole précité de conformité:
Un alors besoin que de remplacer la
next()
méthode déclarée par leGeneratorType
protocole (quiAnyGenerator<T>
est également conforme à l') afin de définir le degré de l'itération de comportement:AnyGenerator
". Je ne vois pas ce queAnyGenerator
est en train de faire quelque chose pour vous. Je ne comprends pas pourquoi ils ont fait le changement, mais ne fournit pas de conseils ou d'explications.AnyGenerator
pour cela. Voir les montages à accepté de répondre. Ils ont juste renommé GeneratorOf à AnyGenerator, et déplacé GeneratorOf(prochaines:) à une nouvelle fonction anyGenerator()