Swift Language
Boucles
Recherche…
Syntaxe
- pour constante en séquence {instructions}
- pour constante en séquence où condition {instructions}
- pour var variable en séquence {instructions}
- pour _ en séquence {instructions}
- pour le cas laisser constante dans la séquence {instructions}
- pour la casse constante dans l'ordre où condition {déclarations}
- pour la variable var dans la séquence {instructions}
- while condition {déclarations}
- répétez les {instructions} pendant que la condition est
- sequence.forEach (body: (Element) lance -> Void)
Boucle d'introduction
La boucle for-in vous permet d'effectuer une itération sur n'importe quelle séquence.
Itérer sur une gamme
Vous pouvez parcourir à la fois les plages ouvertes et fermées:
for i in 0..<3 {
print(i)
}
for i in 0...2 {
print(i)
}
// Both print:
// 0
// 1
// 2
Itérer sur un tableau ou un ensemble
let names = ["James", "Emily", "Miles"]
for name in names {
print(name)
}
// James
// Emily
// Miles
Si vous avez besoin de l'index pour chaque élément du tableau, vous pouvez utiliser la méthode enumerate()
sur 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()
renvoie une séquence paresseuse contenant des paires d'éléments avec Int
s consécutives, à partir de 0. Par conséquent, avec les tableaux, ces nombres correspondent à l'index donné de chaque élément - mais cela peut ne pas être le cas avec d'autres types de collections.
Dans Swift 3, enumerate()
a été renommé en enumerated()
:
for (index, name) in names.enumerated() {
print("The index of \(name) is \(index).")
}
Itérer sur un dictionnaire
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.
Itérer en sens inverse
Vous pouvez utiliser la méthode reverse()
sur SequenceType
pour parcourir une séquence en sens inverse:
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
Dans Swift 3, reverse()
a été renommé en reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Itérer sur des plages avec une foulée personnalisée
En utilisant les méthodes stride(_:_:)
sur Strideable
vous pouvez parcourir une plage avec une foulée personnalisée:
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
Dans Swift 3, les méthodes stride(_:_:)
sur Stridable
ont été remplacées par les fonctions stride(_:_:_:)
globales 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)
}
Boucle répétée
Semblable à la boucle while, seule l'instruction de contrôle est évaluée après la boucle. Par conséquent, la boucle sera toujours exécutée au moins une fois.
var i: Int = 0
repeat {
print(i)
i += 1
} while i < 3
// 0
// 1
// 2
en boucle
A while
boucle exécutera tant que la condition est vraie.
var count = 1
while count < 10 {
print("This is the \(count) run of the loop")
count += 1
}
Type de séquence pour chaque bloc
Un type conforme au protocole SequenceType peut parcourir ses éléments dans une fermeture:
collection.forEach { print($0) }
La même chose pourrait être faite avec un paramètre nommé:
collection.forEach { item in
print(item)
}
* Remarque: Les instructions de flux de contrôle (telles que la rupture ou la poursuite) peuvent ne pas être utilisées dans ces blocs. Un retour peut être appelé, et s'il est appelé, il retournera immédiatement le bloc pour l'itération en cours (un peu comme un continu). La prochaine itération sera alors exécutée.
let arr = [1,2,3,4]
arr.forEach {
// blocks for 3 and 4 will still be called
if $0 == 2 {
return
}
}
Boucle d'introduction avec filtrage
-
where
clause
En ajoutant une clause where
, vous pouvez restreindre les itérations à celles qui satisfont à la condition donnée.
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
- clause de
case
Il est utile de ne parcourir que les valeurs correspondant à un motif:
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
Vous pouvez également filtrer les valeurs facultatives et les déballer si nécessaire en ajoutant ?
marque après liaison constante:
let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
print(number)
}
//31
//5
Briser une boucle
Une boucle s'exécutera tant que sa condition reste vraie, mais vous pouvez l'arrêter manuellement à l'aide du mot-clé break
. Par exemple:
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)