Использование assert в блоке else оператора guard - PullRequest
0 голосов
/ 11 февраля 2019

Я сталкивался с этим в инструкциях по реализации 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 ]

0 голосов
/ 12 февраля 2019

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

0 голосов
/ 12 февраля 2019

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

  • return
  • break
  • continue
  • throw

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

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

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

enter image description here

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

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