2016-07-23 65 views
2

有一些相关的问题,但我没有足够的网站声誉评论现有的线程,迫使我开始一个新的。对于那个很抱歉。任何方式在Swift 3中做真正的条件编译?

看来Swift没有一个真正的预处理器。解决方法是使用#if/#else/#endif,但这里的问题是它不会隐藏编译器中的“错误”部分,强制'true'和'false'部分在语法上是有效的。鉴于Swift 3在语法上与Swift 2不兼容,这很困难 - 有没有人找到一种解决方法,可以创建可以在任一环境下编译的代码? (如果XCode 8测试版允许使用Swift 2.2,或者如果XCode 7.3.1允许使用Swift 3,那么这也会给我一个解决方法)。

我试图做的,举个简单的例子,就是像

#if SWIFT3  
    let session = WCSession.default() 
#else 
    let session = WCSession.defaultSession() 
#end 

我找不到任何方式做到这一点,似乎令人惊讶的是没有一个如何完成Swift2语言完全不兼容的Swift3语法。

+0

Swift 3的语法确实与Swift 2非常不同。所以,即使你有一个预处理器,试图用'#filter'覆盖它也不会起作用。预期的解决方案是将代码库转换为Swift 3(或将其分配给Swift 3)。试图维护一个为两者编译的不重要的代码库都是死路一条(就像Swift 1和Swift 2一样)。 –

+0

@RobNapier我完全同意这一点。这在道德上可能不太合理,但他们的确提供了有条件的编译,而且确实有用。而且我可以想象转换到Swift 3需要逐步进行的情况。 – matt

+0

@matt看起来很有意思,但是从1到2我没有在任何非平凡的代码基础上找到实用的东西。 2到3是一个更大的变化,因为它重新命名了很多东西。很难想象它能够在非常小的代码之外工作。但时间会证明。 –

回答

7

我找不到任何办法做到这一点

然而,有一个,有一直之一,因为雨燕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 

编辑根据Apple的说法,Xcode 8允许将任意条件编译标志传递给Swift:

Active Compilation Conditions是一个新的构建设置将条件编译标志传递给Swift编译器。该设置值的每个元素都以-D作为前缀swiftc,与Preprocessor Macros的元素以相同的前缀传递给clang相同。 (22457329)

+0

谢谢,这确实有用! –