Swift. Цикл for
Назад · Оглавление · Дальше
Contents |
Цикл for
for - цикличное выполнение блока кода для каждого элемента некоторой последовательности (Sequence).
Входная последовательность цикла - любая Sequence (в том числе Collection):
- Array
- Dictionary
- Set
- Range
Вывод на печать всех элементов массива:
for a in [1, 3, 5, 7, 9] { print(a) } // [1, 3, 5, 7, 9].forEach{print($0)}
Сумма всех элементов массива:
let m = [1, 2, 3, 4, 5] var sum = 0 for i in m { sum += i } // m.forEach{sum += $0} sum // 15
Сумма чисел от 1 до 10:
var sum = 0 for i in 1...10 { sum += i } // (1...10).forEach{sum += $0} sum // 55
Отображение кривой изменения значения в Playground:
- клик по темно-серому прямоугольнику в области результатов (напротив sum += i)
- в редакторе кода (под строкой sum += i) появится график изменения переменной sum.
Обработка массива строк:
let musics = ["Rock", "Jazz", "Pop"] for music in musics { print(music, terminator:" ") } // musics.forEach{print($0, terminator:" ")} Консоль: Rock Jazz Pop
Посимвольная обработка строки:
for char in "Swift" { print(char, terminator:" ") } // "Swift".forEach{print($0, terminator:" ")} Консоль: S w i f t
Внешние (относительно for) одноименные параметры не пересекаются с локальными:
var char = "a" let s = "Swift" for char in s { let s = "Char is" print("\(s) \(char)") } char // "a" s // Swift Консоль: Char is S Char is w Char is i Char is f Char is t
Вариант forEach:
s.forEach{ let s = "Char is" print("\(s) \($0)") }
Неиспользуемый связанный параметр можно заменить на нижнее подчеркивание:
for _ in 1...3 { print("Повторяющаяся строка") } // (1...3).forEach{(Int) in print("Повторяющаяся строка")}
Цикл по элементам словаря
Связанные параметры для ключей и значений элементов словаря:
var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"] for (id, name) in dic { print("\(id) \(name)", terminator:"; ") } // dic.forEach{print("\($0) \($1)", terminator:"; ")} Консоль: GB Великобритания; US США; RU Россия;
Dictionary - неупорядоченная коллекция.
Порядок элементов при инициализации и при выводе на консоль могут отличаться.
Блокировать получение ключа или значения можно символом "_":
var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"] for (id, _) in dic { print("\(id)", terminator:" ") } // dic.forEach{print("\($0.key)", terminator:" ")} Консоль: US RU GB
Если нужны только ключи или только значения,
то можно воспользоваться свойствами keys и values:
var dic = ["RU":"Россия", "GB":"Великобритания", "US":"США"] for id in dic.keys { print("\(id)", terminator:" ") } print() for name in dic.values { print("\(name)", terminator:" ") } // dic.keys.forEach{print("\($0)", terminator:" ")} // dic.values.forEach{print("\($0)", terminator:" ")} Консоль: US RU GB США Россия Великобритания
Представление элементов массива в виде кортежа (индекс, значение):
let musics = ["Rock", "Jazz", "Pop"] for (id, value) in musics.enumerated() { print("\(id + 1). \(value)") } // musics.enumerated().forEach{print("\($0 + 1). \($1)")} Консоль: 1. Rock 2. Jazz 3. Pop
Цикл с заданным шагом
Цикл с шагом, включая конечную границу:
for i in stride(from:1, through:7, by:2) { print(i, terminator:" ") } // stride(from:1, through:7, by:2).forEach{print($0, terminator:" ")} // 1 3 5 7 (through:7)
Цикл с шагом, не включая конечную границу:
for i in stride(from:1, to:7, by:2) { print(i, terminator:" ") } // stride(from:1, to:7, by:2).forEach{print($0, terminator:" ")} // 1 3 5 (to:7)
Сумма всех нечетных чисел от 1 до 1000:
var sum = 0 for i in stride(from:1, through:1000, by:2) { sum += i } // stride(from:1, through:1000, by:2).forEach{sum += $0} sum // 250000
stride возвращает коллекцию:
stride(from:through:by:) // StrideThrough<T> stride(from:to:by:) // StrideTo<T> // T - тип данных элементов коллекции
Обратный проход по коллекции
for i in (1...10).reversed() { // проход от 10 до 1 print(i, terminator: " ") } // (1...10).reversed().forEach{print($0, terminator: " ")} Консоль: 10 9 8 7 6 5 4 3 2 1
reverse() - меняет порядок исходной коллекции на обратный reversed() - не меняет исходную коллекцию, а возвращает элементы в обратном порядке
where в цикле for-in
where указывает дополнительные условия итерации
Сумма всех чётных чисел от 1 до 10:
var sum = 0 for i in 1...10 where i % 2 == 0 { sum += i } // (1...10).forEach{if $0 % 2 == 0 {sum += $0}} sum // 30
Снижение производительности при использовании where:
var isRun = true // неэффективно for i in 1...10 where isRun { // проверка isRun выполняется при каждой итерации // тело оператора } // эффективно if isRun { for i in 1...10 { // тело оператора } }
continue в цикле for-in
continue - переход к следующей итерации, без выполнения фрагмента кода после continue.
Вывод в консоль всех четных чисел из диапазона 1...10:
for i in 1...10 { if i % 2 == 0 { continue } print(i, terminator: " ") } Консоль: 1 3 5 7 9
continue нельзя использовать в цикле forEach
break в цикле for-in
break - досрочное завершение работы цикла.
Выход из бесконечного цикла при равенстве случайного числа заданному:
for i in 1... { if Int.random(in: 0...10) == 5 { print("Итерация номер \(i)") break } } Консоль: Итерация номер 11
Еще один вариант генерации случайного числа:
Int(arc4random_uniform(10))
break нельзя использовать в цикле forEach
Использование метки для прерывания внешнего цикла из внутреннего:
stop: for i in 1...4 { for j in i...4 { if j == 3 && i == 2 { break stop } print(i, "-", j) } } Консоль: 1 - 1 1 - 2 1 - 3 1 - 4 2 - 2
Метки используются с операторами break и contitue
Обработка многомерных коллекций
Объявление:
let a: Dictionary<String: Array<String>> = ["s": ["a", "b", "c"]] let b: [String: [String]] = ["s": ["a", "b", "c"]]
Пример:
var games = [ "Red Wings": ["2:1", "2:3"], "Capitals": ["3:6", "5:5"], "Penguins": ["3:3", "1:2"] ] for (name, results) in games { for result in results { print("Игра с \(name) — \(result)") } } Консоль: Игра с Penguins — 3:3 Игра с Penguins — 1:2 Игра с Red Wings — 2:1 Игра с Red Wings — 2:3 Игра с Capitals — 3:6 Игра с Capitals — 5:5
Используем цикл forEach:
games.forEach{(name, results) in results.forEach{ print("Игра с \(name) — \($0)") } }
Примеры
1.
var students: [String:[String:UInt]] = [ "Иванов": ["01-12-2020":5, "02-12-2020":4, "03-12-2020":5], "Петров": ["01-12-2020":4, "02-12-2020":5, "03-12-2020":3], "Сидоров": ["01-12-2020":4, "02-12-2020":4, "03-12-2020":3] ] var totalSum: Double = 0 for student in students { var sum: UInt = 0 for marks in student.value { sum += marks.value } let averageMark = Double(sum) / Double(student.value.count) totalSum += averageMark print(student.key, String(format: "%.2f", averageMark)) } let totalAverageMark = totalSum / Double(students.count) print("Общий средний балл:", String(format: "%.2f", totalAverageMark))
2.
typealias Chessman = [String: (alpha:Character, num:Int)?] var Chessmans: Chessman = [ "Пешка":("A", 2), "Ферзь":("D", 1), "Ладья":nil, ] for name in Chessmans.keys { if let position = Chessmans[name] { if let pos = position { print("\(name) \(pos.alpha)\(pos.num)") } else { print("\(name) фигура взята") } } }
Назад · Оглавление · Дальше