Использование assert в блоке else оператора guard

Я сталкивался с этим в инструкциях по внедрению Google Analytics:

guard let gai = GAI.sharedInstance() else {
    assert(false, "Google Analytics not configured correctly")
}

Я никогда не думал, что возможно иметь утверждение в предложении else без возврата. Это не имеет смысла для меня, потому что утверждение будет оцениваться только в схеме тестирования. Итак, почему компилятор не предупреждает о том, что он не возвращается (в случае сборки выпуска).

Редактировать: это внутри функции application(_:didFinishLaunchingWithOptions) -> Bool

Изменить 2: Дополнительная информация, которую я нашел на это, что отвечает на это:

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

https://help.insight.com/app/answers/detail/a_id/120/~/integrating-google-analytics-into-ios-apps-using-swift-4

2 ответа

Решение

Как правило, защитное заявление будет использовать один из следующих:

  • вернуть
  • перерыв
  • Продолжить
  • бросать

Но вы также можете использовать невозвратную функцию.

Это где fatalError вступает в игру. Вы даже можете создать свой собственный с типом никогда не возвращаться.

С точки зрения OP, это скомпилируется при отладке, но завершится неудачно при сборке релиза.

OP может переписать следующее и заставить его работать:

guard let gai = GAI.sharedInstance() else {
    fatalError("Google Analytics not configured correctly")
}

В DEBUG, поскольку условие утверждения ложно, на этом этапе программа всегда останавливается (утверждение не выполнено). Так что сборка удалась.
В RELEASE компиляция этого кода не удастся

Другие вопросы по тегам