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