🍎 Swift

Цикл 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
Машина времени остановилась!

Частые ошибки новичков

  1. Бесконечный цикл — если забыть изменить переменную в условии, цикл будет работать вечно. Например: while i < 10 { print(i) } (забыли i += 1). Программа зависнет.
  2. Условие сразу ложно — тело цикла while не выполнится ни разу, если условие изначально false. Например: var x = 100; while x < 10 { ... }.
  3. Путаница с repeat-while — помни: в repeat-while код выполняется минимум один раз. Если нужно обязательно выполнить действие до проверки — используй его.
  4. Ошибка в условии — путаница между < и <=. Если нужно выполнить ровно 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, если действие должно выполниться хотя бы один раз. Главное — не забывай изменять переменные в теле цикла, чтобы он не стал бесконечным!