Поиск…


Синтаксис

  • для постоянной последовательности {операторов}
  • для константы в последовательности, где условие {утверждения}
  • для переменной var в последовательности {statements}
  • для _ в последовательности {statements}
  • для случая пусть константа в последовательности {statements}
  • для случая пусть константа в последовательности, где условие {утверждения}
  • для переменной var var в последовательности {statements}
  • в то время как условие {statements}
  • повторять {утверждения} при условии
  • sequence.forEach (body: (Element) throws -> Void)

Входной контур

Цикл for-in позволяет выполнять итерацию по любой последовательности.

Итерирование в диапазоне

Вы можете перебирать как полуоткрытые, так и закрытые диапазоны:

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

for i in 0...2 {
    print(i)
}

// Both print:
// 0
// 1
// 2

Итерация по массиву или установка

let names = ["James", "Emily", "Miles"]

for name in names {
   print(name)
}

// James
// Emily
// Miles
2.1 2.2

Если вам нужен индекс для каждого элемента в массиве, вы можете использовать метод enumerate() в 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() возвращает ленивую последовательность, содержащую пары элементов с последовательным Int s, начиная с 0. Поэтому с массивами эти числа будут соответствовать данному индексу каждого элемента, однако это может быть не так, как в случае с другими типами коллекций.

3.0

В Swift 3, enumerate() было переименовано в enumerated() :

for (index, name) in names.enumerated() {
   print("The index of \(name) is \(index).")
}

Итерация по словарю

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.

Итерация в обратном направлении

2.1 2.2

Вы можете использовать метод reverse() для SequenceType , чтобы перебирать любую последовательность в обратном порядке:

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

В Swift 3, reverse() был переименован в reverse() reversed() :

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

Итерирование по диапазонам с пользовательским шагом

2.1 2.2

Используя методы stride(_:_:) на Strideable вы можете перебирать диапазон с помощью специального шага:

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

В Swift 3 методы stride(_:_:) на Stridable были заменены глобальными 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)
}

Повторите цикл while

Подобно циклу while, после цикла вычисляется только оператор управления. Поэтому цикл будет выполняться как минимум один раз.

var i: Int = 0

repeat {
   print(i)
   i += 1
} while i < 3

// 0
// 1
// 2

while loop

В while цикл будет выполняться до тех пор , пока условие истинно.

var count = 1

while count < 10 {
    print("This is the \(count) run of the loop")
    count += 1
}

Тип последовательности для каждого блока

Тип, который соответствует протоколу SequenceType, может выполнять итерацию через его элементы в закрытии:

collection.forEach { print($0) }

То же самое можно сделать и с именованным параметром:

collection.forEach { item in
    print(item)
}

* Примечание. Операторы потока управления (такие как break или continue) не могут использоваться в этих блоках. Возврат может быть вызван, и если он вызван, он немедленно вернет блок для текущей итерации (как и для продолжения). Затем будет выполнена следующая итерация.

let arr = [1,2,3,4]

arr.forEach {
    
    // blocks for 3 and 4 will still be called
    if $0 == 2 {
        return
    }
}

Цикл ввода-вывода с фильтрацией

  1. where пункт

Добавляя предложение where , вы можете ограничить итерации теми, которые удовлетворяют данному условию.

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. case раздел

Это полезно, когда вам нужно итерации только через значения, которые соответствуют некоторому шаблону:

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

Также вы можете фильтровать необязательные значения и разворачивать их, если необходимо, путем добавления ? знак после константы привязки:

let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
    print(number)
}

//31    
//5

Разрыв петли

Цикл будет выполняться до тех пор, пока его условие остается верным, но вы можете остановить его вручную, используя ключевое слово break . Например:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow