Swift -未检查和断言

Swift -Ounchecked and Assertions

前言

在Swift中,ENABLE_NS_ASSERTIONS被忽略,断言是否打开取决于SWIFT_OPTIMIZATION_LEVELsee here for more information.

我想达到的目标

调试和 Beta 版本应该有断言 enabled,Release 版本应该有断言 disabled.

我怎么做到的

我可以通过 precondition 方法在 Swift 中编写我所有的断言,并使用 -Ounchecked 标志编译发布版本,使用 -O 标志编译 beta 版本。

我不确定什么

iOS 中发布版本的默认值是 -O。有什么建议不要将 -Ounchecked 用于发布版本吗?这会导致其他哪些不良副作用?

你绝对应该编译-Ounchecked发布,以便仅在测试时使用precondition。编译 -Ounchecked 还会禁用对诸如数组越界和展开 nil 之类的检查,这可能会导致一些涉及内存损坏的非常讨厌的生产错误。

您可以通过 swiftc-assert-config 参数独立于编译器优化设置来控制断言行为:

$ cat assert.swift 
assert(false, "assertion asserted")
println("made it here...")
$ swiftc -Onone assert.swift; ./assert
assertion failed: assertion asserted: file assert.swift, line 1
Illegal instruction: 4
$ swiftc -O assert.swift; ./assert
made it here...
$ swiftc -O -assert-config Debug assert.swift; ./assert
assertion failed: assertion asserted: file assert.swift, line 1
Illegal instruction: 4
$ 

看起来好像没有 Xcode 构建设置开关,但您可以使用“其他 Swift 标志”设置添加。