J'ai cette boucle for-in:
for button in view.subviews {
}
Maintenant, je veux que le bouton soit converti en une classe personnalisée afin que je puisse utiliser ses propriétés.
J'ai essayé ceci: for button in view.subviews as AClass
Mais cela ne fonctionne pas et me donne une erreur:'AClass' does not conform to protocol 'SequenceType'
Et j'ai essayé ceci: for button:AClass in view.subviews
Mais cela ne fonctionne pas non plus.
for-loop
swift
for-in-loop
Arbitur
la source
la source
for button in view.subviews as [AClass]
Réponses:
Pour Swift 2 et versions ultérieures:
Swift 2 ajoute des modèles de cas aux boucles for , ce qui rend encore plus facile et plus sûr la saisie de caractères dans une boucle for :
Pourquoi est-ce mieux que ce que vous pourriez faire dans Swift 1.2 et versions antérieures? Parce que les modèles de cas vous permettent de choisir votre type spécifique dans la collection. Il ne correspond qu'au type que vous recherchez, donc si votre tableau contient un mélange, vous ne pouvez opérer que sur un type spécifique.
Par exemple:
Production:
Pour Swift 1.2 :
Dans ce cas, vous effectuez un cast
view.subviews
et nonbutton
, vous devez donc le réduire dans le tableau du type souhaité:Remarque: si le type de tableau sous-jacent n'est pas
[AClass]
, cela plantera. C'est ce que l'!
onas!
vous dit. Si vous n'êtes pas sûr du type, vous pouvez utiliser un cast conditionnelas?
avec une liaison facultativeif let
:Pour Swift 1.1 et versions antérieures:
Remarque: cela plantera également si les sous-vues ne sont pas toutes de type
AClass
. La méthode sûre répertoriée ci-dessus fonctionne également avec les versions antérieures de Swift.la source
[ ]
entre crochets exactement comme dans cet exemple. Peut-être que c'est juste moi, mais je pensais que c'était juste un choix de formatage dans l'exemple de code au début :) Je suppose que c'est parce que nous sommes en train de convertir un tableau.[Class]
air bien mieux queArray<Class>
.Cette option est plus sécurisée:
ou façon rapide:
la source
Vous pouvez également utiliser une
where
clausela source
button
intérieur du corps de la boucle, ce qui est le but des autres solutions. Donc, cela ne lancera le corps de la boucle que sur les élémentsview.subviews
dont sontUIButton
s, mais n'aide pas, par exemple, à appeler desAClass
méthodes spécifiques àbutton
.where
seuls les gardes et ne lance pas.where
peut être plus élégant et lisible pour les cas (jeu de mots non intentionnel) où vous n'avez besoin que d'une garde booléenne.Les réponses fournies sont correctes, je voulais juste ajouter ceci en complément.
Lors de l'utilisation d'une boucle for avec force cast, le code plantera (comme déjà mentionné par d'autres).
Mais au lieu d'utiliser une clause if,
une autre façon est d'utiliser une boucle while:
Ce qui semble être plus pratique si certains éléments (mais pas tous) du tableau peuvent être de type
AClass
.Bien que pour l'instant (à partir de Swift 5), j'opterais pour la boucle for-case:
la source
La réponse fournie par vacawama était correcte dans Swift 1.0. Et ne fonctionne plus avec Swift 2.0.
Si vous essayez, vous obtiendrez une erreur similaire à:
Dans Swift 2.0, vous devez écrire comme:
la source
Vous pouvez effectuer le casting et être en sécurité en même temps avec ceci:
la source