Swift Language
Pętle
Szukaj…
Składnia
- dla stałej w sekwencji {instrukcje}
- dla stałej w sekwencji, w której warunek {instrukcje}
- dla zmiennej var w sekwencji {instrukcje}
- dla _ w sekwencji {instrukcje}
- dla przypadku niech stała w sekwencji {instrukcje}
- dla przypadku niech stała w sekwencji, w której warunek {instrukcje}
- dla zmiennej var case w sekwencji {instrukcje}
- while condition {instrukcje}
- powtórz {instrukcje} podczas warunku
- sekwencji.forEach (ciało: (Element) rzuca -> Pustka)
Pętla wejściowa
Pętla for-in pozwala na iterację w dowolnej sekwencji.
Iteracja w zakresie
Możesz iterować zarówno w zakresie półotwartym, jak i zamkniętym:
for i in 0..<3 {
print(i)
}
for i in 0...2 {
print(i)
}
// Both print:
// 0
// 1
// 2
Iteracja po tablicy lub zestawie
let names = ["James", "Emily", "Miles"]
for name in names {
print(name)
}
// James
// Emily
// Miles
Jeśli potrzebujesz indeksu dla każdego elementu w tablicy, możesz użyć metody enumerate()
na 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()
zwraca leniwą sekwencję zawierającą pary elementów z kolejnymi Int
, zaczynając od 0. Dlatego w przypadku tablic te liczby będą odpowiadały podanemu indeksowi każdego elementu - jednak może nie być tak w przypadku innych rodzajów kolekcji.
Swift 3 enumerate()
została zmieniona na enumerated()
:
for (index, name) in names.enumerated() {
print("The index of \(name) is \(index).")
}
Iterowanie po słowniku
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.
Iteracja w odwrotnej kolejności
Możesz użyć metody reverse()
na SequenceType
w celu iteracji w dowolnej sekwencji w odwrotnej kolejności:
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
W Swift 3 zmieniono nazwę reverse()
reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Iterowanie w zakresie z niestandardowym krokiem
Używając metod stride(_:_:)
w Strideable
, możesz iterować w zakresie z niestandardowym krokiem:
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
W Swift 3 metody stride(_:_:)
w Stridable
zostały zastąpione globalnym stride(_:_:_:)
funkcje 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)
}
Pętla powtarzania podczas
Podobnie jak w pętli while, tylko instrukcja sterująca jest analizowana po pętli. Dlatego pętla zawsze będzie wykonywana co najmniej raz.
var i: Int = 0
repeat {
print(i)
i += 1
} while i < 3
// 0
// 1
// 2
pętla while
while
pętla wykona dopóki warunek jest prawdziwy.
var count = 1
while count < 10 {
print("This is the \(count) run of the loop")
count += 1
}
Typ sekwencji dla każdego bloku
Typ zgodny z protokołem SequenceType może iterować przez swoje elementy w zamknięciu:
collection.forEach { print($0) }
To samo można również zrobić z parametrem o nazwie:
collection.forEach { item in
print(item)
}
* Uwaga: Instrukcje blokujące (takie jak przerwa lub kontynuacja) nie mogą być używane w tych blokach. Można wywołać powrót, a jeśli zostanie wywołany, natychmiast zwróci blok dla bieżącej iteracji (podobnie jak kontynuacja). Następna iteracja zostanie wykonana.
let arr = [1,2,3,4]
arr.forEach {
// blocks for 3 and 4 will still be called
if $0 == 2 {
return
}
}
Pętla wejściowa z filtrowaniem
-
where
klauzula
Dodając klauzulę where
, możesz ograniczyć iteracje do tych, które spełniają podany warunek.
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
- klauzula
case
Jest to przydatne, gdy trzeba iterować tylko wartości pasujące do pewnego wzorca:
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
Możesz także filtrować wartości opcjonalne i rozpakowywać je, jeśli to konieczne, dodając ?
znak po stałej wiązania:
let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
print(number)
}
//31
//5
Przerwanie pętli
Pętla będzie wykonywana tak długo, jak długo jej warunek pozostanie prawdziwy, ale można zatrzymać ją ręcznie za pomocą słowa kluczowego break
. Na przykład:
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)