Swift Language
Loops
Ricerca…
Sintassi
- per costante in sequenza {statement}
- per costante in sequenza dove condizione {statement}
- per variabile var in sequenza {statement}
- per _ in sequenza {istruzioni}
- per caso lascia costante in sequenza {statement}
- per caso lascia costante in sequenza dove condizione {statement}
- per caso var variable in sequence {statements}
- while condition {statement}
- ripeti {dichiarazioni} mentre la condizione
- sequence.forEach (body: (Element) throws -> Void)
Ciclo For-in
Il ciclo for-in consente di eseguire iterazioni su qualsiasi sequenza.
Iterare su un intervallo
Puoi scorrere su intervalli sia semiaperti che chiusi:
for i in 0..<3 {
print(i)
}
for i in 0...2 {
print(i)
}
// Both print:
// 0
// 1
// 2
Iterare su un array o un set
let names = ["James", "Emily", "Miles"]
for name in names {
print(name)
}
// James
// Emily
// Miles
Se è necessario l'indice per ciascun elemento nell'array, è possibile utilizzare il metodo enumerate()
su 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()
restituisce una sequenza lazy che contiene coppie di elementi con Int
consecutivi, a partire da 0. Pertanto con gli array, questi numeri corrisponderanno all'indice dato di ciascun elemento, tuttavia questo potrebbe non essere il caso di altri tipi di collezioni.
In Swift 3, enumerate()
è stato rinominato enumerated()
:
for (index, name) in names.enumerated() {
print("The index of \(name) is \(index).")
}
Iterare su un dizionario
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 al contrario
È possibile utilizzare il metodo reverse()
su SequenceType
per eseguire un'iterazione su qualsiasi sequenza al contrario:
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
In Swift 3, reverse()
è stato rinominato in reverse()
reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Iterare su intervalli con passo personalizzato
Usando i metodi stride(_:_:)
su Strideable
puoi Strideable
su un intervallo con un passo personalizzato:
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
In Swift 3, i metodi stride(_:_:)
su Stridable
sono stati sostituiti dalle funzioni stride(_:_:_:)
globali 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)
}
Ciclo di ripetizione
Simile al ciclo while, solo l'istruzione di controllo viene valutata dopo il ciclo. Pertanto, il ciclo verrà sempre eseguito almeno una volta.
var i: Int = 0
repeat {
print(i)
i += 1
} while i < 3
// 0
// 1
// 2
mentre ciclo
Un ciclo while
verrà eseguito fintanto che la condizione è vera.
var count = 1
while count < 10 {
print("This is the \(count) run of the loop")
count += 1
}
Tipo di sequenza per Ogni blocco
Un tipo conforme al protocollo SequenceType può scorrere gli elementi all'interno di una chiusura:
collection.forEach { print($0) }
Lo stesso potrebbe essere fatto anche con un parametro chiamato:
collection.forEach { item in
print(item)
}
* Nota: le istruzioni di flusso di controllo (come interruzione o continuazione) non possono essere utilizzate in questi blocchi. È possibile chiamare un ritorno e, se chiamato, restituirà immediatamente il blocco per l'iterazione corrente (molto simile a un continuazione). La successiva iterazione verrà quindi eseguita.
let arr = [1,2,3,4]
arr.forEach {
// blocks for 3 and 4 will still be called
if $0 == 2 {
return
}
}
Ciclo For-in con filtraggio
-
where
clausola
Con l'aggiunta di una where
la clausola è possibile limitare le iterazioni a quelli che soddisfano la condizione data.
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
- clausola
case
È utile quando è necessario iterare solo attraverso i valori che corrispondono ad alcuni pattern:
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
Inoltre puoi filtrare i valori opzionali e scartarli se necessario aggiungendo ?
segnare dopo il binding costante:
let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
print(number)
}
//31
//5
Rompere un ciclo
Un ciclo verrà eseguito fino a quando la sua condizione rimarrà true, ma è possibile interromperlo manualmente usando la parola chiave break
. Per esempio:
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)