English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье вы узнаете о цикле for-in, примерах его использования и вариантах.
Цикл for-in используется для выполнения группы задач в течение определенного времени. Эти циклы遍历 любую последовательность, например элементы массива, диапазон или символы строки.
Мы также используем цикл for-in для выполнения некоторых повторяющихся процессов в течение фиксированного времени.
Представьте, что кто-то попросит вас написать программу, которая будет выводить Hello, World! на экран. Ваше решение будет таким:
print("Hello, World!")
Если они изменят主意 и скажут вам написать программу, которая будет выводить Hello, World! на экран пять раз, что вы будете делать? Если у вас нет знаний о циклах, ваше решение может быть таким:
print("Hello, World!") print("Hello, World!") print("Hello, World!") print("Hello, World!") print("Hello, World!")
Да, выполнение пяти одинаковых кодов для выполнения одной и той же работы может занимать много времени. Если так, что вы будете делать, если кто-то попросит вас написать программу, которая будет выводить Hello, World! на экран несколько сотен или даже миллионов раз?
Одним из простейших решений является написание команды print, которая будет выполняться указанное количество раз. Звучит странно, не так ли? Но с помощью нескольких строк кода в цикле for-in можно найти лучшее решение:
for i in 1...100 { //Выводить Hello World 100 раз на экран print("Hello, World!") }
Не волнуйтесь по поводу грамматики, мы будем обсуждать это дальше.
Вы можете создать цикл for-in в Swift, как показано ниже:
for <value> in <range> { <some work here> }
В上面的 цикле итерируется диапазон, и мы можем обращаться к каждому элементу, возвращаемому из этого диапазона, в переменной <value>. Если вы не знакомы с диапазонами, можно посмотреть следующую статью:Диапазоны Swift.
Итерируемая последовательность является <range>.
Установить <value> в первый номер диапазона и выполнить инструкции в цикле < Некоторая работа здесь >
После выполнения инструкции <value> обновляется, чтобы включать второе значение <range>, и выполняется инструкция <Некоторая работа здесь>又被执行。
Этот процесс продолжается до достижения конца диапазона и остановки цикла.
for i in 1...3 { print("Hello world! Значение равно \(i)") }
При запуске программы, вывод будет следующим:
Hello world! Значение равно 1 Hello world! Значение равно 2 Hello world! Значение равно 3
В上面的 программе диапазон для итерации составляет от 1 до 3.
Значение i устанавливается в первый номер диапазона (1) и обновляется на следующий номер диапазона в каждом итерации. Этот процесс продолжается до конца диапазона (3).
Итерация | Значение, возвращаемое из диапазона (i) | Вывод |
---|---|---|
1 | 1 | Hello world! Значение равно 1 |
2 | 2 | Hello world! Значение равно 2 |
3 | 3 | Hello world! Значение равно 3 |
Если в цикле не используется значение диапазона, то в Swift можно использовать (подчеркнутый _), чтобы его отбросить, как показано ниже:
for _ in <range> { <some work here> }
//В этом примере значения игнорируются, и используется оператор полуполного интервала for _ in 1..<3 { print("Hello world!") }
При запуске программы, вывод будет следующим:
Hello world! Hello world!
В上面的 программе, благодаря использованиюОператор полуполного интервалаТаким образом, диапазон последовательности для итерации составляет от 1 до 2, включая нижний предел (1), но не включая верхний предел (3).
Подчеркнутая черта _ игнорирует значение из диапазона (1) и выполняет строку print. Затем вызывается снова строка print для следующей итерации, и процесс заканчивается, потому что 2 - это последнее значение в диапазоне.
Итерация | Значения, возвращаемые из диапазона | Вывод |
---|---|---|
1 | Отброс | Hello world! |
2 | Отброс | Hello world! |
Если вы хотите, чтобы цикл увеличивался на фиксированное значение (а не на диапазон) в каждом итерации, вам нужно использовать метод stride.
let interval = 2 for i in stride(from: 1, to: 10, by: interval) { print(i) }
При запуске программы, вывод будет следующим:
1 3 5 7 9
В上面的 программе функция stride возвращает числовую последовательность: 1, 3, 5, 7, 9.
Значение i устанавливается в первый номер последовательности (1), и выполняется строка print в цикле, которая выводит " 1" в консоли.
После выполнения этой строки значение i обновляется на другое значение (3), и вызывается снова语句 print. Этот процесс продолжается до тех пор, пока не будут пройдены все элементы последовательности.
Значение | Условие (Value < End) | i (вывод) |
---|---|---|
1 | 1 < 10 (истина) | 1 |
1 + 2 = 3 | 3 < 10 (истина) | 3 |
1 + 2 * 2 = 5 | 5 < 10 (истина) | 5 |
1 + 3 * 2 = 7 | 7 < 10 (истина) | 7 |
1 + 4 * 2 = 9 | 9 < 10 (истина) | 9 |
1 + 5 * 2 = 11 | 11 < 10 (ложь) | Stops |
Предположим, что у вас есть массив строк, как показано ниже. Если вы не знаете, что такое массив, можете представить его как единичную емкость, которая может хранить несколько значений. Для более детального описания см.Массив Swift.
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"]
Что если кто-то скажет вам, как напечатать все языки программирования?
Одним из методов является использование индексов programmingLanguages[0], programmingLanguages[1]... для доступа к этим элементам, и так далее, до тех пор, пока не получите все элементы. Но это слишком муторно.
Таким образом, цикл становится полезным. Вы можете использовать цикл for in для итерации:
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"] for language in programmingLanguages { print(language) }
При запуске программы, вывод будет следующим:
Swift Java Go JavaScript Kotlin Python
В上面的 программе последовательностью для итерации является массив строк.
Значение variable language устанавливается в первый элемент массива и выполняется строка print в цикле, которая выводит в консоли «Swift».
После выполнения этой строки переменная language будет обновлена на следующий элемент массива и вызовется снова строка print. Этот процесс продолжается до тех пор, пока не будет достигнут последний элемент массива.
Поскольку в SwiftСтрокатакже является множеством, поэтому вы можете использовать цикл for для доступа к каждому символу в строке.
for value in "I♥Swift!" { print(value) }
При запуске программы, вывод будет следующим:
I ♥ S w i f t !
Если вам нужно получить индекс массива (положение элемента в массиве, например 0, 1, 2), то вам нужно использовать метод enumerated:
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"] for (index, language) in programmingLanguages.enumerated() { print("\(index):\(language)") }
При запуске программы, вывод будет следующим:
0:Swift 1:Java 2:Go 3:JavaScript 4:Kotlin 5:Python
Здесь метод перечисления возвращает массив, состоящий из кортежей (Int, String), содержащих индекс (Int) и значение (String) каждого элемента. Например: (0,Swift), (1,Java)
Используя цикл for-in, вы можете逐ленно访问 эти элементы в кортеже. Если вы не знаете, что такое Tuple (кортеж), то можете просто представить его как контейнер, который может содержать значения различных типов.
Вы также можете использоватьwhereподзадача фильтрует содержимое цикла for
for value in "I♥Swift!" where value != "!" { print(value) //удалить восклицательный знак }
При запуске программы, вывод будет следующим:
I ♥ S w i f t
В上面的 программе, последовательностью для итерации является строка (множество символов).
value устанавливается в первый символ строки и проверяется с помощью условия where. Если условие возвращает true, то выполняется блок в цикле (печать предложения), который выводит в консоли «I».
После выполнения предложения, value обновляется на следующий символ строки и проверяется условие снова. Если условие возвращает false, то блок не выполняется, и value обновляется на следующий символ.
Этот процесс продолжается до достижения последнего символа строки.
Итерация | value | value != “!” | Вывод |
---|---|---|---|
1 | I | true | I |
2 | ♥ | true | ♥ |
3 | S | true | S |
4 | w | true | w |
5 | i | true | i |
6 | f | true | f |
7 | t | true | t |
8 | ! | false |