Подтвердить что ты не робот

Поведение Swift Assertions в производственных приложениях

Я читаю раздел "Утверждения" в Swift e-book, и похоже, что утверждения работают очень похоже на их сопоставления Objective-C. Однако нигде в документах я не могу найти что-либо о стиле выполнения во время работы в качестве производственного приложения. Objective-C NSAssert promises никогда не прекращать производственное приложение в результате отказа утверждения. Это тот же случай в Swift?

4b9b3361

Ответ 1

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

Если ваш код запускает утверждение при запуске в отладке среда, например, когда вы создаете и запускаете приложение в Xcode, вы можете видеть, где произошло недопустимое состояние, и запросить состояние ваше приложение в то время, когда это утверждение было инициировано. Утверждение также позволяет предоставить подходящее отладочное сообщение о характере утверждать.

И в блоке "Примечание":

Утверждения заставляют ваше приложение завершаться и не заменяют проектирование вашего кода таким образом, чтобы недействительные условия были маловероятными возникать. Тем не менее, в ситуациях, когда недействительными являются условия возможно, утверждение является эффективным способом обеспечения того, чтобы такие условия выделены и отмечены во время разработки, приложение опубликовано.

Ответ 2

Разница между debug и release заключается в различии между аргументами компилятора. Наиболее вероятный ответ заключается в том, что будут некоторые специальные настройки компилятора (похожие на -ea в Java).

ИЗМЕНИТЬ
Компилятор Swift имеет аргумент -assert-config

-assert-config Укажите замену assert_configuration. Возможные значения: Debug, Release, Replacement.

В Release, утверждения игнорируются. Не уверен относительно разницы между Debug и Replacement.

enter image description here

Ответ 3

Утверждения документируются вместе с предварительными условиями в документации по стандартной библиотеке Swift.

  • Отладка → Остановить сбой утверждения.
  • Release → Компилировать с игнорируемыми утверждениями
  • Отпустить и "Отключить проверки безопасности" → Предположите, что все утверждения являются утверждениями истины и подсказками для компилятора, чтобы следующий и предыдущий код можно было удалить, если они были достигнуты только в условиях, когда это утверждение потерпело бы неудачу. Это означает, что, если вы следуете утверждению по коду на обработчике исключительного случая, его можно игнорировать. Если бы утверждение не получилось, поведение было бы полностью undefined.

Я не проверял, но "Отключить проверки безопасности" может коррелировать с заменой -assert-config, которую упоминает @Sulthan.