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
2.1 2.2

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.

3.0

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

2.1 2.2

È 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
3.0

In Swift 3, reverse() è stato rinominato in reverse() reversed() :

for i in (0..<3).reversed() {
    print(i)
}

Iterare su intervalli con passo personalizzato

2.1 2.2

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
1.2 3.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

  1. 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
  1. 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)


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow