for-loop - iterativos - do while matlab ejemplo
Tipo de fundiciĆ³n en bucle for-in (6)
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 tampoco funciona eso.
Esta opción es más segura:
for case let button as AClass in view.subviews {
}
o manera rápida:
view.subviews
.compactMap { $0 as AClass }
.forEach { .... }
La respuesta proporcionada por vacawama fue correcta en Swift 1.0. Y ya no funciona con Swift 2.0.
Si lo intentas, obtendrás un error similar a:
''[AnyObject]'' no es convertible a ''[AClass]'';
En Swift 2.0 necesitas escribir como:
for button in view.subviews as! [AClass]
{
}
Las respuestas proporcionadas son correctas, solo quería agregar esto como una adición.
Cuando se utiliza un bucle for con la conversión forzada, el código se bloqueará (como ya han mencionado otros).
for button in view.subviews as! [AClass] {
// do something with button
}
Pero en lugar de usar una cláusula if,
if let subviews = view.subviews as? [AClass] {
// If we get here, then subviews is of type [AClass]
...
}
otra forma es usar un ciclo while:
/* If you need the index: */
var iterator = view.subviews.enumerated().makeIterator()
while let (index, subview) = iterator.next() as? (Int, AClass) {
// Use the subview
// ...
}
/* If you don''t need the index: */
var iterator = view.subviews.enumerated().makeIterator()
while let subview = iterator.next().element as? AClass {
// Use the subview
// ...
}
Lo que parece ser más conveniente si algunos elementos (pero no todos) de la matriz podrían ser del tipo
AClass
.
Aunque por ahora (a partir de Swift 5), elegiría el bucle for-case:
for case let (index, subview as AClass) in view.subviews.enumerated() {
// ...
}
for case let subview as AClass in view.subviews {
// ...
}
Para Swift 2 y posterior:
Swift 2 agrega patrones de casos a bucles for , lo que hace que sea aún más fácil y seguro escribir cast en un bucle for :
for case let button as AClass in view.subviews {
// do something with button
}
¿Por qué es esto mejor de lo que podrías hacer en Swift 1.2 y versiones anteriores? Debido a que los patrones de casos 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 con un tipo específico.
Por ejemplo:
let array: [Any] = [1, 1.2, "Hello", true, [1, 2, 3], "World!"]
for case let str as String in array {
print(str)
}
Salida:
Hello World!
Para Swift 1.2 :
En este caso, está
view.subviews
y no el
button
, por lo que debe convertirlo en la matriz del tipo que desee:
for button in view.subviews as! [AClass] {
// do something with button
}
Nota: Si el tipo de matriz subyacente no es
[AClass]
, se bloqueará.
Eso es lo que el
!
en
as!
te esta diciendo.
Si no está seguro del tipo, ¿puede usar una conversión condicional
as?
junto con el enlace opcional
if let
:
if let subviews = view.subviews as? [AClass] {
// If we get here, then subviews is of type [AClass]
for button in subviews {
// do something with button
}
}
Para Swift 1.1 y versiones anteriores:
for button in view.subviews as [AClass] {
// do something with button
}
Nota: Esto también se bloqueará si las subvistas no son todas del tipo
AClass
.
El método seguro mencionado anteriormente también funciona con versiones anteriores de Swift.
Puedes realizar el casting y estar seguro al mismo tiempo con esto:
for button in view.subviews.compactMap({ $0 as? AClass }) {
}
También puede usar una cláusula
where
for button in view.subviews where button is UIButton {
...
}