Swift -Ounchecked和断言

前言

在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版本,使用-O标志构建beta版本。

我不确定的是什么

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

你绝对应该为了只在测试时使用precondition而编译-Ounchecked for release。 编译-Ounchecked还会禁用对数组越界-Ounchecked nil等内容的检查,这可能会导致一些涉及内存损坏的非常讨厌的生产错误。

您可以通过-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 Build Settings切换,但您可以使用“Other Swift Flags”设置添加。