Основы Swift / 6.3. Циклы While 2 - repeat-while


Видео


repeat-while
Другой вариант цикла while известен как цикл repeat-while, он выполняет сперва один проход через цикл до вычисления условия цикла. Цикл продолжает повторяться, пока условие не станет ложным.

Цикл repeat-while в Swift является аналогом циклу do-while в других языках.

Здесь мы вновь приведём пример игры про змей и лестниц, но запишем его с помощью цикла repeat-while. Значения finalSquare, board, square и diceRoll инициализированы тем же способом, что и в случае с циклом while.
@{6.3\1\1}

let finalSquare = 25
var board = [Int](repeating: 0, count: finalSquare + 1)
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
var square = 0
var diceRoll = 0
                    
repeat-while 2
В этой версии игры первое действие в цикле - проверка на наличие лестницы или змеи. Ни одна лестница на доске не переместит игрока прямо на клетку 25, так что не существует возможности выиграть игру, перейдя по лестнице. Однако является безопасным проверить на наличие змеи или лестницы первым действием цикла.

Изначально игрок находится на "нулевой клетке". board[0] всегда равен 0 и не имеет эффектов по перемещению.

После проверки кодом на наличие змей и лестниц происходит бросок кубика, а игрок перемещается вперёд на количество ячеек, равное diceRoll. Текущий шаг цикла завершается.

Условие цикла (while square < finalSquare) такое же, как и раньше, но в этот раз оно не будет вычисляться до конца первого шага цикла. Структура цикла repeat-while более подходит для этой игры, нежели цикл while из предыдущего примера. В цикле repeat-while выше square += board[square] всегда выполняется сразу после того, как условие цикла while подтверждает, что square всё ещё в пределах доски. Это поведение убирает необходимость для проверки границ массива, которое можно увидеть в версии игры с помощью цикла while, описанной ранее.
@{6.3\1\2}

repeat {
    // переместиться вверх или вниз через змею или лестницу
    square += board[square]
    // бросить кубик
    diceRoll += 1
    if diceRoll == 7 {diceRoll = 1}
    // сброс значения кубика
    square += diceRoll
} while square < finalSquare
print("Game over!")