Цикл while и do-while в Swift 5.9: подробное руководство
Цикл while и do-while в Swift
Зачем нужны циклы?
Представь, что тебе нужно 100 раз написать в тетради: «Я буду программировать отлично». Писать каждый раз вручную — долго и скучно. В программировании для таких повторяющихся действий используют циклы.
Цикл while (читается «вайл», переводится как «пока») — это команда: «Делай это снова и снова, пока условие верно». Как только условие перестаёт выполняться, цикл останавливается.
Основной синтаксис цикла while
while условие {
// код, который будет повторяться
}
Важно: сначала проверяется условие. Если оно истинно (true), выполняется тело цикла. Если ложно (false) — цикл пропускается.
Пример 1. Считаем до 5
var count = 1
while count <= 5 {
print("Число: \(count)")
count += 1
}
Вывод:
Число: 1
Число: 2
Число: 3
Число: 4
Число: 5
Цикл repeat-while (do-while в других языках)
В Swift есть ещё одна версия — repeat-while. Её отличие: сначала выполняется код, потом проверяется условие. Поэтому тело цикла выполнится минимум один раз, даже если условие сразу ложно.
repeat {
// код, который выполнится хотя бы один раз
} while условие
Пример 2. Гадалка
var guess = 0
let secretNumber = 7
repeat {
print("Угадай число от 1 до 10:")
guess = Int(readLine() ?? "0") ?? 0
if guess != secretNumber {
print("Неверно! Попробуй ещё.")
}
} while guess != secretNumber
print("Поздравляю! Ты угадал!")
Здесь программа сначала просит ввести число, потом проверяет. Если не угадал — повторяет. Цикл гарантирует, что пользователь сделает хотя бы одну попытку.
Разбор типичных задач
Задача 1. Робот-шахтёр
Робот собирает кристаллы, пока энергия в сумке не станет 100 или больше. Каждый кристалл даёт случайное количество энергии от 5 до 20.
var energy = 0
while energy < 100 {
let crystalPower = Int.random(in: 5...20)
energy += crystalPower
print("Найден кристалл на \(crystalPower) единиц. Всего энергии: \(energy)")
}
print("Сумка полна! Энергия: \(energy)")
Вывод (примерный):
Найден кристалл на 12 единиц. Всего энергии: 12
Найден кристалл на 18 единиц. Всего энергии: 30
...
Найден кристалл на 15 единиц. Всего энергии: 105
Сумка полна! Энергия: 105
Задача 2. Юный садовод
Алекс хочет узнать, сколько дней потребуется, чтобы росток вырос до нужной высоты. Начальная высота — 5 см, каждый день увеличивается в 2 раза, цель — 80 см.
var height = 5
var days = 0
let targetHeight = 80
let growthRate = 2
while height < targetHeight {
height *= growthRate
days += 1
print("День \(days): высота \(height) см")
}
print("Росток достиг высоты \(height) см за \(days) дней")
Вывод:
День 1: высота 10 см
День 2: высота 20 см
День 3: высота 40 см
День 4: высота 80 см
Росток достиг высоты 80 см за 4 дней
Задача 3. Обратный отсчёт
Доктор Вэнс запускает машину времени с начальной координаты n. Каждую секунду координата уменьшается на 2, пока не станет меньше или равна 0.
print("Введите начальную временную координату:")
let n = Int(readLine() ?? "0") ?? 0
var time = n
while time > 0 {
print("Текущая координата: \(time)")
time -= 2
}
print("Машина времени остановилась!")
Ввод: 10
Вывод:
Текущая координата: 10
Текущая координата: 8
Текущая координата: 6
Текущая координата: 4
Текущая координата: 2
Машина времени остановилась!
Частые ошибки новичков
- Бесконечный цикл — если забыть изменить переменную в условии, цикл будет работать вечно. Например:
while i < 10 { print(i) }(забылиi += 1). Программа зависнет. - Условие сразу ложно — тело цикла
whileне выполнится ни разу, если условие изначально false. Например:var x = 100; while x < 10 { ... }. - Путаница с repeat-while — помни: в
repeat-whileкод выполняется минимум один раз. Если нужно обязательно выполнить действие до проверки — используй его. - Ошибка в условии — путаница между < и <=. Если нужно выполнить ровно 10 раз, условие
count < 10выполнит 10 итераций (0...9), аcount <= 10— 11 итераций.
Итоговый пример: Волшебная экспедиция
Ты находишь Артефакт Силы. Он начинает светиться, и ты понимаешь: нужно вводить коды (числа). Если ввести 0 — артефакт активируется. Если ввести отрицательное число — он теряет силу и нужно ввести новое число. Если положительное — сила растёт.
var power = 0
var code = 0
print("Введи код для Артефакта (0 — активация, отрицательное — сброс):")
repeat {
code = Int(readLine() ?? "0") ?? 0
if code > 0 {
power += code
print("Сила артефакта: \(power)")
} else if code < 0 {
power = 0
print("Сила сброшена! Введи новый код.")
}
} while code != 0
print("Артефакт активирован! Итоговая сила: \(power)")
Пример работы:
Введи код для Артефакта (0 — активация, отрицательное — сброс):
5
Сила артефакта: 5
10
Сила артефакта: 15
-1
Сила сброшена! Введи новый код.
7
Сила артефакта: 7
0
Артефакт активирован! Итоговая сила: 7
Вывод
Циклы while и repeat-while — это мощные инструменты для повторения действий, когда заранее неизвестно, сколько раз их нужно выполнить. Используй while, если нужно сначала проверить условие, и repeat-while, если действие должно выполниться хотя бы один раз. Главное — не забывай изменять переменные в теле цикла, чтобы он не стал бесконечным!