我可以找到Swift断言的所有解释,解释assert*
被-O
抛出但precondition*
被保留,除非设置了-Ounchecked
。
但是,我们现在将whole-module optimization -wmo
作为发布版本的新默认值。
启用整个模块优化后,是否保留precondition*
个断言?
答案 0 :(得分:1)
考虑这个小程序:
func f(_ i: Int) -> Int {
assert(i > 0, "needed positive number")
return i
}
print(f(0))
使用xcrun swiftc [opt]
进行编译并运行结果给出:
-Onone
:断言错误-Onone -wmo
:断言错误-O
:打印0 -O -wmo
:打印0 相比之下:
func f(_ i: Int) -> Int {
precondition(i > 0, "needed positive number")
return i
}
print(f(0))
-Onone
:前提条件错误-Onone -wmo
:前提条件错误-O
:非法指示:4 -O -wmo
:非法指示:4 我无法解释最后两个结果,但似乎很清楚整个模块优化不会影响断言的处理方式;只有优化级别很重要。
这是
Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9