Swift -Ounchecked和断言

fab*_*abb 4 assert ios swift

前言

在Swift中,ENABLE_NS_ASSERTIONS被忽略,断言是打开还是关闭取决于SWIFT_OPTIMIZATION_LEVEL,请参阅此处以获取更多信息.

  • assert() 积极参与 -Onone
  • assertionFailure() 积极参与 -Onone
  • precondition()是活跃的-Onone-O
  • preconditionFailure()是活跃的-Onone,-O-Ounchecked
  • fatalError()是活跃的-Onone,-O-Ounchecked

我想要实现的目标

调试和Beta 版本应该启用断言,版本构建应该禁用断言.

我怎么能做到

我可以通过该precondition方法在Swift中编写所有断言,并使用-Ounchecked标志编译Release版本,使用标志构建beta版本-O.

我不确定的是什么

iOS版本中的默认版本是-O.有没有建议不要使用-Ounchecked发布版本?这可能导致哪些其他不良副作用?

Air*_*ity 9

绝对应该-Ounchecked为发布编译,以便precondition仅在测试时使用.编译-Ounchecked还会禁用对数组越界和解包等内容的检查nil,这可能会导致一些涉及内存损坏的非常讨厌的生产错误.

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

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

它看起来不像是有一个Xcode Build Settings切换,但您可以使用"Other Swift Flags"设置添加.