Разница между "предварительным условием" и "утверждением" быстрым?

Какая разница между precondition(condition: Bool, message: String) и assert(condition: Bool, message: String) в Swift?

Оба они выглядят одинаково для меня. В каком контексте мы должны использовать один над другим?

Ответ 1

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 является серьезным ошибка программирования.

Ответ 2

Я нашел 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

- утверждать: проверка собственного кода для внутренних ошибок

- предварительное условие: для проверки того, что ваши клиенты предоставили вам действительные аргументы.

Кроме того, вам нужно быть осторожным в том, что использовать, см. уровень подтверждения и уровня оптимизации

Ответ 3

precondition активен в режиме деблокирования, так что вы, когда отправляете свое приложение, а предварительное условие не удается, приложение завершится. Assert работает только в режиме отладки по умолчанию.

Я нашел это замечательное объяснение, когда его использовать в NSHipster:

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

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

Ответ 4

Предпосылкой

func precondition(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

Проверьте необходимое условие для продвижения вперед.

  • Используйте эту функцию для обнаружения условий, которые должны препятствовать программе от продолжения даже в судоходном коде.
  • На игровых площадках и -Новые сборки (по умолчанию для Xcode Debug конфигурация): если условие оценивается как false, остановите программу выполнение в состоянии отладки после печати сообщения.
  • In -O builds (по умолчанию для конфигурации Xcode Release): if условие оценивает значение false, останавливает выполнение программы.
  • In -Ounchecked builds, условие не оценивается, но оптимизатор может предположить, что он будет оцениваться как истинный. Несоблюдение этого предположение в -Ounchecked builds является серьезной ошибкой программирования.

утверждают,

func assert(condition: @autoclosure () -> Bool, _ message: @autoclosure () -> String = default, file: StaticString = default, line: UWord = default)

Традиционное утверждение C-стиля с необязательным сообщением.

  • Используйте эту функцию для внутренних проверок работоспособности, которые активны во время но не влияют на производительность кода доставки. Проверить недопустимое использование в выпусках; см. предварительное условие.

  • В игровых площадках и -Новые сборки (по умолчанию для Xcode Debug   конфигурация): если условие оценивается как false, остановите программу   выполнение в состоянии отладки после печати сообщения.

  • В строках -O (по умолчанию для конфигурации Xcode Release)   условие не оценивается, и нет эффектов
  • In -Ounchecked builds, условие не оценивается, но оптимизатор   может предположить, что он будет оцениваться как истинный. Несоблюдение этого   предположение в -Ounchecked builds - серьезное программирование erro