Swift Language
Bucles
Buscar..
Sintaxis
- para constantes en secuencia {sentencias}
- para constante en secuencia donde condición {declaraciones}
- para var variable en secuencia {sentencias}
- para _ en secuencia {sentencias}
- para caso dejar constante en secuencia {sentencias}
- para el caso se deja constante en secuencia donde condición {declaraciones}
- para el caso var variable en secuencia {sentencias}
- condición {declaraciones}
- repite {sentencias} mientras condición
- sequence.forEach (body: (Element) throws -> Void)
Bucle de entrada
El bucle for-in te permite iterar sobre cualquier secuencia.
Iterando sobre un rango
Puede iterar en rangos medio abiertos y cerrados:
for i in 0..<3 {
print(i)
}
for i in 0...2 {
print(i)
}
// Both print:
// 0
// 1
// 2
Iterando sobre una matriz o conjunto
let names = ["James", "Emily", "Miles"]
for name in names {
print(name)
}
// James
// Emily
// Miles
Si necesita el índice para cada elemento de la matriz, puede usar el método enumerate()
en SequenceType
.
for (index, name) in names.enumerate() {
print("The index of \(name) is \(index).")
}
// The index of James is 0.
// The index of Emily is 1.
// The index of Miles is 2.
enumerate()
devuelve una secuencia perezosa que contiene pares de elementos con Int
s consecutivos, comenzando desde 0. Por lo tanto, con matrices, estos números corresponderán al índice dado de cada elemento; sin embargo, esto puede no ser el caso con otros tipos de colecciones.
En Swift 3, enumerate()
ha sido renombrado a enumerated()
:
for (index, name) in names.enumerated() {
print("The index of \(name) is \(index).")
}
Iterando sobre un diccionario
let ages = ["James": 29, "Emily": 24]
for (name, age) in ages {
print(name, "is", age, "years old.")
}
// Emily is 24 years old.
// James is 29 years old.
Iterando a la inversa
Puede usar el método reverse()
en SequenceType
para iterar sobre cualquier secuencia a la inversa:
for i in (0..<3).reverse() {
print(i)
}
for i in (0...2).reverse() {
print(i)
}
// Both print:
// 2
// 1
// 0
let names = ["James", "Emily", "Miles"]
for name in names.reverse() {
print(name)
}
// Miles
// Emily
// James
En Swift 3, reverse()
ha cambiado su nombre a reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Iterando sobre rangos con zancada personalizada
Mediante el uso de los métodos stride(_:_:)
en Strideable
puede iterar en un rango con un paso personalizado:
for i in 4.stride(to: 0, by: -2) {
print(i)
}
// 4
// 2
for i in 4.stride(through: 0, by: -2) {
print(i)
}
// 4
// 2
// 0
En Swift 3, los métodos de stride(_:_:)
en Stridable
han sido reemplazados por las funciones de stride(_:_:_:)
global stride(_:_:_:)
:
for i in stride(from: 4, to: 0, by: -2) {
print(i)
}
for i in stride(from: 4, through: 0, by: -2) {
print(i)
}
Bucle de repetición
De manera similar al bucle while, solo se evalúa la instrucción de control después del bucle. Por lo tanto, el bucle siempre se ejecutará al menos una vez.
var i: Int = 0
repeat {
print(i)
i += 1
} while i < 3
// 0
// 1
// 2
mientras bucle
Un while
de bucle se ejecutará siempre que la condición es verdadera.
var count = 1
while count < 10 {
print("This is the \(count) run of the loop")
count += 1
}
Tipo de secuencia para cada bloque
Un tipo que se ajuste al protocolo SequenceType puede recorrer sus elementos dentro de un cierre:
collection.forEach { print($0) }
Lo mismo podría hacerse con un parámetro nombrado:
collection.forEach { item in
print(item)
}
* Nota: las declaraciones de flujo de control (como break o continue) no pueden usarse en estos bloques. Se puede llamar a una devolución y, si se llama, devolverá inmediatamente el bloque para la iteración actual (como lo haría una continuación). La siguiente iteración se ejecutará.
let arr = [1,2,3,4]
arr.forEach {
// blocks for 3 and 4 will still be called
if $0 == 2 {
return
}
}
Bucle de entrada con filtrado.
-
where
cláusula
Al agregar una cláusula where
, puede restringir las iteraciones a aquellas que satisfagan la condición dada.
for i in 0..<5 where i % 2 == 0 {
print(i)
}
// 0
// 2
// 4
let names = ["James", "Emily", "Miles"]
for name in names where name.characters.contains("s") {
print(name)
}
// James
// Miles
- cláusula de
case
Es útil cuando necesita iterar solo a través de los valores que coinciden con algún patrón:
let points = [(5, 0), (31, 0), (5, 31)]
for case (_, 0) in points {
print("point on x-axis")
}
//point on x-axis
//point on x-axis
¿También puede filtrar valores opcionales y desenvolverlos si es apropiado agregando ?
marcar después de la constante de unión:
let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
print(number)
}
//31
//5
Rompiendo un bucle
Un bucle se ejecutará mientras su condición siga siendo verdadera, pero puede detenerlo manualmente usando la palabra clave break
. Por ejemplo:
var peopleArray = ["John", "Nicole", "Thomas", "Richard", "Brian", "Novak", "Vick", "Amanda", "Sonya"]
var positionOfNovak = 0
for person in peopleArray {
if person == "Novak" { break }
positionOfNovak += 1
}
print("Novak is the element located on position [\(positionOfNovak)] in peopleArray.")
//prints out: Novak is the element located on position 5 in peopleArray. (which is true)