Какая разница между precondition(condition: Bool, message: String)
и assert(condition: Bool, message: String)
в Swift?
Оба они выглядят одинаково для меня. В каком контексте мы должны использовать один над другим?
Какая разница между precondition(condition: Bool, message: String)
и assert(condition: Bool, message: String)
в Swift?
Оба они выглядят одинаково для меня. В каком контексте мы должны использовать один над другим?
assert
предназначен для проверки работоспособности во время тестирования, тогда как precondition
предназначен для защиты от вещей, которые, если они произойдут, означают, что ваша программа просто не может разумно продолжить.
Так, например, вы можете поместить assert
в некоторый расчет, имеющий разумные результаты (в некоторых пределах, скажем), чтобы быстро найти, есть ли у вас ошибка. Но вы не захотите с этим справиться, так как результат внебрачной связи может быть действительным и не критичным, поэтому не должен разбивать ваше приложение (предположим, вы просто использовали его для отображения прогресса в индикаторе выполнения).
С другой стороны, проверяя, что индекс в массиве действителен, когда выборка элемента является precondition
. Не существует разумного следующего действия для объекта массива, когда он запрашивает недопустимый индекс, поскольку он должен возвращать необязательное значение.
Полный текст из документов (попробуйте выбрать опции assert
и precondition
в Xcode):
Предпосылкой
Проверьте необходимое условие для продвижения вперед.
Используйте эту функцию для обнаружения условий, которые должны программа от продолжения даже в отгрузочном коде.
В игровых площадках и -Новые сборки (по умолчанию для Xcode Debug конфигурация): если
condition
оценивается как false, остановите программу выполнение в состоянии отладки после печатиmessage
.In -O builds (по умолчанию для конфигурации Xcode Release): если
condition
оценивается как false, прекратите выполнение программы.В строках -Ounchecked,
condition
не оценивается, но оптимизатор может предположить, что он будет оценивать доtrue
. недостаточность чтобы удовлетворить это предположение в -Ounchecked builds является серьезным ошибка программирования.
Утверждай
Традиционное утверждение C-стиля с необязательным сообщением.
Используйте эту функцию для внутренних проверок работоспособности, которые активны во время тестирования, но не влияют на производительность кода доставки. Проверить наличие недопустимого использования в версиях выпуска; см.
precondition
.
В игровых площадках и -Новые сборки (по умолчанию для Xcode Debug конфигурация): если
condition
оценивается как false, остановите программу выполнение в состоянии отладки после печатиmessage
.В строках -O (по умолчанию для конфигурации Xcode Release),
condition
не оценивается, и никаких эффектов нет.В строках -Ounchecked,
condition
не оценивается, но оптимизатор может предположить, что он будет оценивать доtrue
. недостаточность чтобы удовлетворить это предположение в -Ounchecked builds является серьезным ошибка программирования.
Я нашел Swift утверждает - недостающее руководство, чтобы быть полезным
debug release release
function -Onone -O -Ounchecked
assert() YES NO NO
assertionFailure() YES NO NO**
precondition() YES YES NO
preconditionFailure() YES YES YES**
fatalError()* YES YES YES
И из Интересные дискуссии по Swift Evolution
- утверждать: проверка собственного кода для внутренних ошибок
- предварительное условие: для проверки того, что ваши клиенты предоставили вам действительные аргументы.
Кроме того, вам нужно быть осторожным в том, что использовать, см. уровень подтверждения и уровня оптимизации
precondition
активен в режиме деблокирования, так что вы, когда отправляете свое приложение, а предварительное условие не удается, приложение завершится.
Assert
работает только в режиме отладки по умолчанию.
Я нашел это замечательное объяснение, когда его использовать в NSHipster:
Утверждения - это концепция, заимствованная из классической логики. В логике, утверждения - утверждения о предложениях в доказательстве. В программирование, утверждения означают предположения, сделанные программистом о приложении в том месте, где они объявлены.
При использовании в качестве предусловий и постусловий, которые описать ожидания относительно состояния кода в начале и конец выполнения метода или функции, утверждения образуют контракт. Утверждения также могут использоваться для обеспечения условий во время выполнения, в чтобы предотвратить выполнение при возникновении определенных предварительных условий.
Предпосылкой
func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Проверьте необходимое условие для продвижения вперед.
утверждают,
func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)
Традиционное утверждение C-стиля с необязательным сообщением.
Используйте эту функцию для внутренних проверок работоспособности, которые активны во время но не влияют на производительность кода доставки. Проверить недопустимое использование в выпусках; см. предварительное условие.
В игровых площадках и -Новые сборки (по умолчанию для Xcode Debug конфигурация): если условие оценивается как false, остановите программу выполнение в состоянии отладки после печати сообщения.