在guard语句的else块中使用assert

Dre*_*rew 2 ios swift guard-statement

我在Google Analytics的实施说明中遇到了这个问题:

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

我从来没有想过可以在else子句中有一个断言,而不返回.这对我来说没有意义,因为断言只会在测试方案中进行评估.那么,为什么编译器不警告它不返回(在发布版本的情况下).

编辑:这是在功能范围内 application(_:didFinishLaunchingWithOptions) -> Bool

编辑2:我发现的其他信息可以解答它:

不幸的是,一旦你进行发布构建,这将会中断,因为在发布配置中删除了断言,并且一个保护块必须结束当前作用域的执行.

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

Cod*_*der 6

通常,guard语句将使用以下之一:

  • 返回
  • 打破
  • 继续

但是,您也可以使用非返回功能.

这是fatalError发挥作用的地方.您甚至可以使用Never return类型创建自己的自定义.

对于OP点,将在调试中编译,但在发布版本中失败.

在此输入图像描述

OP可以重写以下内容并使其工作:

guard let gai = GAI.sharedInstance() else {
    fatalError("Google Analytics not configured correctly")
}
Run Code Online (Sandbox Code Playgroud)