Основы Swift / 4.6. Операторы выполнения и предусловия


Видео


Операторы выполнения и предусловия
Операторы контроля и предусловия проверяют то, что происходит во время выполнения программы. Вы можете использовать их для того, чтобы убедиться, что определённое условие выполняется перед исполнением любого дальнейшего кода. Если Булево условие в операторе контроля или предусловии вычисляется в true, то выполнение кода продолжается в обычном режиме; иначе текущее состояние программы некорректно, а выполнение кода прекращается и приложение терминируется.

Вы можете использовать операторы выполнения и предусловия для выражения допущений и предположений, которые Вы делаете в процессе программирования. Операторы выполнения помогают Вам находить ошибки и некорректные допущения в процессе разработки, а предусловия помогают Вам находить ошибки в продакшене. Операторы контроля и предусловия могут выступать полезным способом документирования программы. В отличие от обработки ошибок операторы контроля и предусловия не используются для восстановимых или ожидаемых ошибок: так как проваленный оператор выполнения или предусловия есть индикаторы некорректного состояния программы, то нету способа отловить их

Использование операторов выполнения и предусловий - это не замена для разработки такого когда, в котором некорректные состояния маловероятны. Они также помогают ограничить ущерб, вызываемый этим состоянием.

Разница между операторами выполнения и предусловиями состоит в том, когда они проверяются: операторы выполнения проверяются только в дебаг-сборках, тогда как предусловия проверяются как в дебаг-сборках, так и в продакшн-билдах. В продакшн-сборках условия внутри операторов выполнения не вычисляются, это значит, что Вы можете использовать так много операторов выполнения в процессе разработки, сколько захотите, без влияния на производительность в продакшне.
Продакшн и разработка
Продакшн (от английского production, иначе продакшен) - состояние информационной системы, когда та находится в режиме реальной эксплуатации.

Сборки (build/билд) для продакшна (производства) и разработки могут отличаться уровнем оптимизации и даже поведением.
Отладка с помощью операторов выполнения
Вы можете создать оператор выполнения вызвав функцию стандартной библиотеки языка Swift assert(_:_:file:line). Вы передаёте в эту функцию выражение, которое может быть вычислено в true или false, и сообщение, которое отобразится в случае, если результат условия - false. Например:
@{4.6\1}
                    
let age = -3
assert(age >= 0, "Возраст человека не может быть меньше нуля")
                    
                
В этом примере выполнение кода продолжается, если выражение age >= 0 вычисляется в true, что значит - значение age положительно. Если значение age отрицательно, как в коде выше, тогда значение age >= 0 вычисляется в false, то оператор выполнения проваливается, терминируя приложение.
Опускание отладочного сообщения
Вы можете опустить отладочное сообщение, например, если оно просто повторяет условие:
@{4.6\2}
                    
let age = -3
assert(age >= 0)
                    
                
Вынос условия за оператор выполнения
Если код сам проверяет условие, то используйте функцию assertionFailure(_:file:line) для индикации того, что оператор выполнения проваливается. Например:
@{4.6\3}
                    
let age = -3
if age > 10 {
    print("Вы можете кататься на американских горках или чёртовом колесе")
} else if age > 0 {
    print("Вы можете кататься на чёртовом колесе")
} else {
    assertionFailure("Возраст человека не может быть меньше нуля")
}
                    
                
Как можно заметить, будет выведено сообщение "Возраст человека не может быть меньше нуля".
Соблюдение предусловий
Используйте предусловие всегда, когда условие может быть потенциально быть ложным, но всегда должно быть определённо истинным, чтобы Ваш код продолжил своё выполнение. К примеру, используйте предусловие для проверки того, что индекс не вышел за границы, или для проверки того, что функция получила корректное значение.

Вы можете записать предусловия, вызвав функцию precondition(_:_:file:line). Вы передаёте в эту функцию выражение, вычисляемое в true или false и сообщение, выводимое в случае, если условие - false. Например:
@{4.6\4}
                    
//Реализация индекса
precondition(index > 0, "Индекс должен быть больше 0")
                    
                
Вынос условия за предусловие
Вы можете также вызвать функцию preconditionFailure(_:file:line) для отображения того, что ошибка уже случилась, например, если был выбран кейс инструкции switch по-умолчанию, но все корректные случаи вводимых данных должны быть обработаны одним из других кейсов.
Имплементация
Имплементация (от английского implementation) в Swift - это просто реализация чего-либо. В некоторых других языках это слово применяется к реализации интерфейсов и протоколов, что неверно в Swift.
Создание фатальных ошибок
Если Вы собираете программу в режиме без проверки (-Ounchecked), предусловия не будут обрабатываться. Компилятор примет в таком случае, что предисловия всегда истинны, и будет соответственно обрабатывать Ваш код. Однако функция fatalError(_:file:line:) всегда вызовет прерывание выполнения вне зависимости от настроек оптимизации.

Вы можете использовать функцию fatalError(_:file:line:) в процессе прототипирования и ранней разработки для создания заглушен для функционала, который ещё нереализован, написав fatalError("Unimplemented"). Так как фатальные ошибки никогда не вырезаются при оптимизации в отличие от операторов выполнения и предусловий, Вы можете быть уверены, что выполнение всегда будет прервано, когда достигнет заглушек имплементации.