在 Swift 3 中有什么方法可以进行真正的条件编译?
Any way to do true conditional compilation in Swift 3?
有一些相关问题,但我的站点信誉不足,无法对现有线程发表评论,这迫使我开始一个新线程。抱歉。
看来 Swift 没有真正的预处理器。使用#if / #else / #endif 可以解决问题,但这里的问题是它不会对编译器隐藏 'false' 部分,强制 'true' 和 'false' 部分在句法上是有效的。这很难,因为 Swift 3 在语法上与 Swift 2 不兼容——有没有人找到一种解决方法来创建可以为任一环境编译的代码? (如果 XCode 8 beta 允许 Swift 2.2,或者如果 XCode 7.3.1 允许 Swift 3,那也会给我一个解决方法。
我想做的,举一个简单的例子,是这样的
#if SWIFT3
let session = WCSession.default()
#else
let session = WCSession.defaultSession()
#end
我找不到任何方法来做到这一点,鉴于 Swift3 语法与 Swift2 完全不兼容,没有办法做到这一点似乎令人惊讶。
I can't find any way to do this
然而,有一个,而且自 Swift 2.2 以来 已经有一个;他们提前计划了这种意外情况:
https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md
所以,像这样(我不知道 WCSession 是什么,所以我用了一个不同的例子):
#if swift(>=3.0)
let screen = UIScreen.main()
#else
let screen = UIScreen.mainScreen()
#endif
EDIT 根据 Apple 的说法,Xcode 8 允许将任意条件编译标志传递给 Swift:
Active Compilation Conditions
is a new build setting for passing conditional compilation flags to the Swift compiler. Each element of the value of this setting passes to swiftc
prefixed with -D
, in the same way that elements of Preprocessor Macros
pass to clang
with the same prefix. (22457329)
有一些相关问题,但我的站点信誉不足,无法对现有线程发表评论,这迫使我开始一个新线程。抱歉。
看来 Swift 没有真正的预处理器。使用#if / #else / #endif 可以解决问题,但这里的问题是它不会对编译器隐藏 'false' 部分,强制 'true' 和 'false' 部分在句法上是有效的。这很难,因为 Swift 3 在语法上与 Swift 2 不兼容——有没有人找到一种解决方法来创建可以为任一环境编译的代码? (如果 XCode 8 beta 允许 Swift 2.2,或者如果 XCode 7.3.1 允许 Swift 3,那也会给我一个解决方法。
我想做的,举一个简单的例子,是这样的
#if SWIFT3
let session = WCSession.default()
#else
let session = WCSession.defaultSession()
#end
我找不到任何方法来做到这一点,鉴于 Swift3 语法与 Swift2 完全不兼容,没有办法做到这一点似乎令人惊讶。
I can't find any way to do this
然而,有一个,而且自 Swift 2.2 以来 已经有一个;他们提前计划了这种意外情况:
https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md
所以,像这样(我不知道 WCSession 是什么,所以我用了一个不同的例子):
#if swift(>=3.0)
let screen = UIScreen.main()
#else
let screen = UIScreen.mainScreen()
#endif
EDIT 根据 Apple 的说法,Xcode 8 允许将任意条件编译标志传递给 Swift:
Active Compilation Conditions
is a new build setting for passing conditional compilation flags to the Swift compiler. Each element of the value of this setting passes toswiftc
prefixed with-D
, in the same way that elements ofPreprocessor Macros
pass toclang
with the same prefix. (22457329)