Tengo este bucle for-in:
for button in view.subviews {
}
Ahora quiero que el botón se convierta en una clase personalizada para poder usar sus propiedades.
Intenté esto: for button in view.subviews as AClass
Pero no funciona y me da un error:'AClass' does not conform to protocol 'SequenceType'
Y probé esto: for button:AClass in view.subviews
Pero eso tampoco funciona.
for-loop
swift
for-in-loop
Arbitur
fuente
fuente
for button in view.subviews as [AClass]
Respuestas:
Para Swift 2 y posteriores:
Swift 2 agrega patrones de caso a los bucles for , lo que hace que sea aún más fácil y seguro escribir cast en un bucle for :
¿Por qué esto es mejor que lo que podría hacer en Swift 1.2 y versiones anteriores? Porque los patrones de caja le permiten elegir su tipo específico de la colección. Solo coincide con el tipo que está buscando, por lo que si su matriz contiene una mezcla, puede operar solo en un tipo específico.
Por ejemplo:
Salida:
Para Swift 1.2 :
En este caso, está transmitiendo
view.subviews
y nobutton
, por lo que debe reducirlo a la matriz del tipo que desea:Nota: Si el tipo de matriz subyacente no lo es
[AClass]
, se bloqueará. Eso es lo que te está diciendo el!
onas!
. Si no está seguro del tipo, puede usar una conversión condicionalas?
junto con un enlace opcionalif let
:Para Swift 1.1 y versiones anteriores:
Nota: Esto también fallará si las subvistas no son todas de tipo
AClass
. El método seguro mencionado anteriormente también funciona con versiones anteriores de Swift.fuente
[ ]
corchetes exactamente como en este ejemplo. Tal vez sea solo yo, pero pensé que era solo una opción de formato en el ejemplo de código al principio :) Supongo que esto se debe a que estamos transmitiendo a una matriz.[Class]
ve mucho mejor queArray<Class>
.Esta opción es más segura:
o manera rápida:
fuente
También puedes usar una
where
cláusulafuente
button
dentro del cuerpo del bucle, que es el objetivo de las otras soluciones. Por lo tanto, esto solo ejecutará el cuerpo del bucle en elementos de losview.subviews
cuales sonUIButton
s, pero no ayuda, por ejemplo, en llamar aAClass
métodos específicosbutton
.where
solo protege y no lanza.where
puede ser más elegante y legible para los casos (juego de palabras involuntario) en los que solo necesita una protección booleana.Las respuestas proporcionadas son correctas, solo quería agregar esto como una adición.
Cuando se usa un bucle for con conversión forzada, el código se bloqueará (como ya lo mencionaron otros).
Pero en lugar de usar una cláusula if,
otra forma es usar un ciclo while:
Lo que parece ser más conveniente si algunos elementos (pero no todos) de la matriz pueden ser de tipo
AClass
.Aunque por ahora (a partir de Swift 5), optaría por el bucle for-case:
fuente
La respuesta proporcionada por vacawama fue correcta en Swift 1.0. Y ya no funciona con Swift 2.0.
Si lo intenta, obtendrá un error similar a:
En Swift 2.0 necesitas escribir como:
fuente
Puedes realizar el casting y estar seguro al mismo tiempo con esto:
fuente