Відповіді:
assert
призначений для перевірки стану здоров'я під час тестування, тоді precondition
як для захисту від речей, які, якщо вони відбудуться, означали б, що ваша програма просто не може розумно продовжувати роботу.
Так, наприклад, ви можете покласти assert
на якийсь розрахунок, який має розумні результати (скажімо, в деяких межах), щоб швидко виявити, чи є у вас помилка. Але ви не хочете поставлятися з цим, оскільки результат, який знаходиться поза межами, може бути дійсним і не критичним, тому не повинен збивати додаток (припустимо, ви просто використовували його для відображення прогресу на панелі прогресу).
З іншого боку, перевірка на те, що підпис на масиві є дійсним під час отримання елемента, є a precondition
. Немає жодної розумної наступної дії для об’єкта масиву, який слід здійснити, коли його запитують про недійсний індекс, оскільки він повинен повертати необов'язкове значення.
Повний текст із документів (спробуйте клацнути параметр assert
та precondition
в Xcode):
Передумова
Перевірте необхідну умову для досягнення прогресу вперед.
Використовуйте цю функцію для виявлення умов, які повинні перешкоджати роботі програми навіть у коді доставки.
На ігрових майданчиках та -Onone збирає (за замовчуванням для конфігурації налагодження Xcode): якщо
condition
оцінюється як false, зупиніть виконання програми у стані налагодження після друкуmessage
.Вбудовує -O (за замовчуванням для конфігурації випуску Xcode): якщо
condition
оцінюється як false, зупиніть виконання програми.У -Ounchecked будує,
condition
не оцінює, але оптимізатор може припустити , що вона буде обчислюватисяtrue
. Невиконання цього припущення в -провірених побудовах є серйозною помилкою програмування.
Затвердити
Традиційне твердження у стилі С із додатковим повідомленням.
Використовуйте цю функцію для внутрішніх перевірок санітарності, які активні під час тестування, але не впливають на продуктивність коду доставки. Щоб перевірити недійсне використання у версії версій; див
precondition
.
На ігрових майданчиках та -Onone збирає (за замовчуванням для конфігурації налагодження Xcode): якщо
condition
оцінюється як false, зупиніть виконання програми у стані налагодження після друкуmessage
.In -O збірки (за замовчуванням для конфігурації випуску Xcode),
condition
не оцінюються, і ефектів немає.У -Ounchecked будує,
condition
не оцінює, але оптимізатор може припустити , що вона буде обчислюватисяtrue
. Невиконання цього припущення в -провірених побудовах є серйозною помилкою програмування.
data["name"]
його немає, але воно повинно. Стверджуючи, що знаходиться всередині охоронця. Інакше {} допоможе мені зрозуміти мою помилку, врізавшись і привівши мене до проблеми. Аналогічно, якби цей код був у виробництві, асдрад не зірвав би програму, і будь-який резервний код, який я використовував ( return nil
), взяв би на себе.
Я знайшов твердження Свіфта - відсутній посібник буде корисним
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
І з цікавих дискусій про швидку еволюцію
- стверджувати: перевірка власного коду на наявність внутрішніх помилок
- передумова: перевірити, чи ваші клієнти дали вагомі аргументи.
Крім того, вам слід бути обережними щодо того, чим користуватися, див. ТвердженняFailure та Optimization Level
precondition()
і preconditionFailure()
які мають ті ж моделі поведінки . Різниця між цими функціями полягає в тому, що: precondition
потрібна умова всередині, а preconditionFailure
просто викиньте.
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)
Традиційне твердження у стилі С із додатковим повідомленням.
Використовуйте цю функцію для внутрішніх перевірок санітарності, які активні під час тестування, але не впливають на продуктивність коду доставки. Щоб перевірити недійсне використання у версії версій; див. передумову.
На ігрових майданчиках та -Onone збирає (за замовчуванням для конфігурації налагодження Xcode): якщо умова оцінюється як помилкове, зупиніть виконання програми у стані налагодження після друку повідомлення.
Просто хотів додати свої 2 копійки. Ви можете додати стільки тверджень у свій код, скільки хочете. Ви можете відправити код за допомогою цих тверджень. Swift НЕ оцінює ці кодові блоки для виробничих додатків. Вони оцінюються лише у випадку налагодження.
Додавання посилання на документацію
Також додається зображення з swift.org
Також зауважте, що це не стосується передумов. Код, поставлений з передумовами, вийде з ладу, і додаток припиниться, якщо попередні умови не будуть оцінені як істинні.
Отже, коротше, твердження призначені для налагодження, але їх можна відправляти, не впливаючи на виробництво. Твердження будуть оцінені в режимі налагодження, але не у виробництві.
І
PreConditions - це переконання, що на виробничому середовищі не трапляються несподівані речі. Ці умови оцінюються, і додаток буде припинено, якщо він буде помилковим