В чем разница между precondition(condition: Bool, message: String)
и assert(condition: Bool, message: String)
в Swift?
Мне они оба кажутся одинаковыми. В каком контексте мы должны использовать одно вместо другого?
assert
предназначен для проверки работоспособности во время тестирования, тогда как он precondition
предназначен для защиты от вещей, которые, если они произойдут, будут означать, что ваша программа просто не сможет работать.
Так, например, вы можете выполнить assert
некоторые вычисления, дающие разумные результаты (скажем, в определенных пределах), чтобы быстро определить, есть ли у вас ошибка. Но вы бы не хотели поставлять это с этим, поскольку результат выхода за пределы может быть действительным и не критичным, поэтому не должно вызывать сбой вашего приложения (предположим, вы просто использовали его для отображения прогресса на индикаторе выполнения).
С другой стороны, проверка допустимости нижнего индекса в массиве при выборке элемента - это precondition
. При запросе недопустимого нижнего индекса у объекта массива нет разумных следующих действий, поскольку он должен возвращать необязательное значение.
Полный текст из документации (попробуйте щелкнуть опцию assert
и precondition
в Xcode):
Предварительное условие
Отметьте необходимое условие для продвижения вперед.
Используйте эту функцию для обнаружения условий, которые должны препятствовать работе программы даже в коде доставки.
В игровых площадках и сборках -Onone (по умолчанию для конфигурации отладки Xcode): если
condition
значение равно false, остановить выполнение программы в отлаживаемом состоянии после печатиmessage
.В сборках -O (по умолчанию для конфигурации выпуска Xcode): если
condition
оценивается как false, остановить выполнение программы.В -Ounchecked строит,
condition
не оценивается, но оптимизатор может предположить , что она будет вычислятьсяtrue
. Несоблюдение этого предположения в сборках -Ounchecked является серьезной ошибкой программирования.
Утверждать
Традиционное утверждение в стиле C с дополнительным сообщением.
Используйте эту функцию для внутренних проверок работоспособности, которые активны во время тестирования, но не влияют на производительность кода доставки. Чтобы проверить недопустимое использование в сборках Release; см
precondition
.
В игровых площадках и сборках -Onone (по умолчанию для конфигурации отладки Xcode): если
condition
значение равно false, остановить выполнение программы в отлаживаемом состоянии после печатиmessage
.Сборки In -O (по умолчанию для конфигурации выпуска Xcode)
condition
не оцениваются, и нет никаких эффектов.В -Ounchecked строит,
condition
не оценивается, но оптимизатор может предположить , что она будет вычислятьсяtrue
. Несоблюдение этого предположения в сборках -Ounchecked является серьезной ошибкой программирования.
data["name"]
его нет, но он должен. Наличие утверждения внутри guard..else {} помогло бы мне отловить мою ошибку, сбой и приведя меня к проблеме. Точно так же, если бы этот код был в производстве, assert не привел бы к сбою программы, и любой резервный код, который я использовал (return nil
), взял бы на себя.Я нашел утверждения Swift - отсутствующее руководство было полезным
И из интересных дискуссий о Swift Evolution
Кроме того, вы должны быть осторожны с тем, что использовать, см. AssertionFailure и Optimization Level.
источник
precondition()
иpreconditionFailure()
которые имеют те же модели поведения . Разница между этими функциями заключается в следующем:precondition
нужно условие внутри, аpreconditionFailure
просто выбросить.precondition
Активно в режиме выпуска , так что вы , когда вы отправляете ваше приложение и предварительное условие не удалось приложение завершится.Assert
по умолчанию работает только в режиме отладки.Я нашел это отличное объяснение, когда использовать его на NSHipster:
источник
Отметьте необходимое условие для продвижения вперед.
Традиционное утверждение в стиле C с дополнительным сообщением.
Используйте эту функцию для внутренних проверок работоспособности, которые активны во время тестирования, но не влияют на производительность кода доставки. Чтобы проверить недопустимое использование в сборках Release; см. предварительное условие.
В игровых площадках и сборках -Onone (по умолчанию для конфигурации отладки Xcode): если условие оценивается как ложное, остановить выполнение программы в отлаживаемом состоянии после печати сообщения.
источник
Просто хотел добавить свои 2 цента. Вы можете добавить в свой код столько утверждений, сколько захотите. Вы можете отправить свой код с этими утверждениями. Swift НЕ оценивает эти блоки кода для производственных приложений. Они оцениваются только в случае режима отладки.
Добавление ссылки на документацию
Также прикрепляю изображение с swift.org
Также обратите внимание, что это не относится к предварительным условиям. Код, поставляемый с предварительными условиями, выйдет из строя, и приложение прекратит работу, если предварительные условия не будут оценены как истинные.
Короче говоря, утверждения предназначены для отладки, но могут быть отправлены без ущерба для производства. Утверждения будут оцениваться в режиме отладки, но не в продакшене.
И
Предварительные условия предназначены для предотвращения непредвиденных ситуаций в производственной среде. Эти условия оцениваются и завершат работу вашего приложения, если они будут признаны ложными.
источник