在 guard 语句的 else 块中使用 assert

Using assert in the else block of guard statement

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

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

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

编辑:这是在函数内 application(_:didFinishLaunchingWithOptions) -> Bool

编辑 2:我找到的其他信息可以回答它:

Unfortunately, this will break as soon as you do a release build, since assertions are removed in release configurations, and a guard block must end execution of the current scope.

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

通常,保护语句会使用以下之一:

  • return
  • 中断
  • 继续
  • 投掷

但是,您也可以使用 non-returning function

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

到 OP 点,将在调试中编译,但在发布构建中失败。

OP 可以重写以下内容并让它工作:

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

在DEBUG中,由于断言条件为假,它总是在此时停止程序(断言失败)。所以构建成功。
在 RELEASE 中,此代码的编译将失败