在 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.
通常,保护语句会使用以下之一:
- return
- 中断
- 继续
- 投掷
但是,您也可以使用 non-returning function。
这就是 fatalError
发挥作用的地方。您甚至可以使用 Never return 类型创建您自己的自定义。
到 OP 点,将在调试中编译,但在发布构建中失败。
OP 可以重写以下内容并让它工作:
guard let gai = GAI.sharedInstance() else {
fatalError("Google Analytics not configured correctly")
}
在DEBUG中,由于断言条件为假,它总是在此时停止程序(断言失败)。所以构建成功。
在 RELEASE 中,此代码的编译将失败
我在 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.
通常,保护语句会使用以下之一:
- return
- 中断
- 继续
- 投掷
但是,您也可以使用 non-returning function。
这就是 fatalError
发挥作用的地方。您甚至可以使用 Never return 类型创建您自己的自定义。
到 OP 点,将在调试中编译,但在发布构建中失败。
OP 可以重写以下内容并让它工作:
guard let gai = GAI.sharedInstance() else {
fatalError("Google Analytics not configured correctly")
}
在DEBUG中,由于断言条件为假,它总是在此时停止程序(断言失败)。所以构建成功。
在 RELEASE 中,此代码的编译将失败