Использование assert в блоке else оператора guard
Я сталкивался с этим в инструкциях по внедрению Google Analytics:
guard let gai = GAI.sharedInstance() else {
assert(false, "Google Analytics not configured correctly")
}
Я никогда не думал, что возможно иметь утверждение в предложении else без возврата. Это не имеет смысла для меня, потому что утверждение будет оцениваться только в схеме тестирования. Итак, почему компилятор не предупреждает о том, что он не возвращается (в случае сборки выпуска).
Редактировать: это внутри функции application(_:didFinishLaunchingWithOptions) -> Bool
Изменить 2: Дополнительная информация, которую я нашел на это, что отвечает на это:
К сожалению, это сломается, как только вы сделаете сборку релиза, так как утверждения удаляются в конфигурациях релиза, и защитный блок должен завершить выполнение текущей области.
2 ответа
Как правило, защитное заявление будет использовать один из следующих:
- вернуть
- перерыв
- Продолжить
- бросать
Но вы также можете использовать невозвратную функцию.
Это где fatalError
вступает в игру. Вы даже можете создать свой собственный с типом никогда не возвращаться.
С точки зрения OP, это скомпилируется при отладке, но завершится неудачно при сборке релиза.
OP может переписать следующее и заставить его работать:
guard let gai = GAI.sharedInstance() else {
fatalError("Google Analytics not configured correctly")
}
В DEBUG, поскольку условие утверждения ложно, на этом этапе программа всегда останавливается (утверждение не выполнено). Так что сборка удалась.
В RELEASE компиляция этого кода не удастся