在 guard 语句的 else 块中使用 assert

Posted

技术标签:

【中文标题】在 guard 语句的 else 块中使用 assert【英文标题】:Using assert in the else block of guard statement 【发布时间】:2019-02-11 20:56:01 【问题描述】:

我在 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

【问题讨论】:

guard let 和 if let 的用法相似但不一样。你不必在 guard let 的 else 块中返回。你可以检查一下。理解这两个概念很有帮助..***.com/questions/32256834/swift-guard-vs-if-let 实际上这应该无法在发布版本中编译(在我的快速测试中也是如此)。 【参考方案1】:

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

返回 打破 继续 投掷

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

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在 guard 语句的 else 块中使用 assert的主要内容,如果未能解决你的问题,请参考以下文章

swift3.0回首guard的奇妙之处

简化条件表达式之以卫语句取代嵌套条件表达式(Replace Nested Conditional With Guard Clauses)

设计模式-策略模式Strategy以及消灭if else

python条件语句

为啥在 try/except 块中使用 Python 的“else”子句? [复制]

java,循环结构简洁介绍(浓缩才是精华)