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

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.

3.0

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

2.1 2.2

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
3.0

W Swift 3 zmieniono nazwę reverse() reversed() :

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

Iterowanie w zakresie z niestandardowym krokiem

2.1 2.2

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
1,2 3,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

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow