在 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的主要内容,如果未能解决你的问题,请参考以下文章
简化条件表达式之以卫语句取代嵌套条件表达式(Replace Nested Conditional With Guard Clauses)