Swift -未检查和断言
Swift -Ounchecked and Assertions
前言
在Swift中,ENABLE_NS_ASSERTIONS
被忽略,断言是否打开取决于SWIFT_OPTIMIZATION_LEVEL
、see here for more information.
assert()
有效 -Onone
assertionFailure()
有效
-Onone
precondition()
对 -Onone
和 -O
有效
preconditionFailure()
对 -Onone
、-O
和 -Ounchecked
有效
fatalError()
对 -Onone
、-O
和 -Ounchecked
有效
我想达到的目标
调试和 Beta 版本应该有断言 enabled,Release 版本应该有断言 disabled.
我怎么做到的
我可以通过 precondition
方法在 Swift 中编写我所有的断言,并使用 -Ounchecked
标志编译发布版本,使用 -O
标志编译 beta 版本。
我不确定什么
iOS 中发布版本的默认值是 -O
。有什么建议不要将 -Ounchecked
用于发布版本吗?这会导致其他哪些不良副作用?
你绝对应该不编译-Ounchecked
发布,以便仅在测试时使用precondition
。编译 -Ounchecked
还会禁用对诸如数组越界和展开 nil
之类的检查,这可能会导致一些涉及内存损坏的非常讨厌的生产错误。
您可以通过 swiftc
的 -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 构建设置开关,但您可以使用“其他 Swift 标志”设置添加。
前言
在Swift中,ENABLE_NS_ASSERTIONS
被忽略,断言是否打开取决于SWIFT_OPTIMIZATION_LEVEL
、see here for more information.
assert()
有效-Onone
assertionFailure()
有效-Onone
precondition()
对-Onone
和-O
有效
preconditionFailure()
对-Onone
、-O
和-Ounchecked
有效
fatalError()
对-Onone
、-O
和-Ounchecked
有效
我想达到的目标
调试和 Beta 版本应该有断言 enabled,Release 版本应该有断言 disabled.
我怎么做到的
我可以通过 precondition
方法在 Swift 中编写我所有的断言,并使用 -Ounchecked
标志编译发布版本,使用 -O
标志编译 beta 版本。
我不确定什么
iOS 中发布版本的默认值是 -O
。有什么建议不要将 -Ounchecked
用于发布版本吗?这会导致其他哪些不良副作用?
你绝对应该不编译-Ounchecked
发布,以便仅在测试时使用precondition
。编译 -Ounchecked
还会禁用对诸如数组越界和展开 nil
之类的检查,这可能会导致一些涉及内存损坏的非常讨厌的生产错误。
您可以通过 swiftc
的 -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 构建设置开关,但您可以使用“其他 Swift 标志”设置添加。