Swift Language
Loops
Поиск…
Синтаксис
- для постоянной последовательности {операторов}
- для константы в последовательности, где условие {утверждения}
- для переменной 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
Если вам нужен индекс для каждого элемента в массиве, вы можете использовать метод 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. Поэтому с массивами эти числа будут соответствовать данному индексу каждого элемента, однако это может быть не так, как в случае с другими типами коллекций.
В 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.
Итерация в обратном направлении
Вы можете использовать метод 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
В Swift 3, reverse()
был переименован в reverse()
reversed()
:
for i in (0..<3).reversed() {
print(i)
}
Итерирование по диапазонам с пользовательским шагом
Используя методы 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
В 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
}
}
Цикл ввода-вывода с фильтрацией
-
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
-
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)