前言

在Swift中,ENABLE_NS_ASSERTIONS被忽略,并且断言是打开还是关闭取决于SWIFT_OPTIMIZATION_LEVELsee here for more information

  • assert()-Onone有效
  • assertionFailure()在以下时间处于 Activity 状态-Onone
  • precondition()对于-Onone-O处于 Activity 状态
  • preconditionFailure()可用于-Onone-O-Ounchecked
  • fatalError()可用于-Onone-O-Ounchecked

  • 我想要达到的目标

    调试和Beta构建应具有断言启用,发布构建应具有断言禁用

    我该怎么做

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

    我不确定的是

    iOS中Release版本的默认值为-O。有什么建议不要使用-Ounchecked进行发行版本?这可能会导致其他哪些不良副作用?

    最佳答案

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

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

    $ 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”设置进行添加。

    07-27 15:49