Xcode 有没有办法在Swift 3中进行真正的条件编译?

Xcode 有没有办法在Swift 3中进行真正的条件编译?,xcode,swift3,Xcode,Swift3,有一些相关的问题,但我没有足够的网站声誉评论现有的线程,迫使我开始一个新的。很抱歉 斯威夫特似乎没有真正的预处理器。使用#if/#else/#endif可以解决问题,但这里的问题是它不会对编译器隐藏“false”部分,从而强制“true”和“false”部分在语法上有效。考虑到Swift 3在语法上与Swift 2不兼容,这是很困难的——有没有人找到了一种解决方法,可以创建可以为任何一种环境编译的代码?(如果XCode 8 beta允许Swift 2.2,或者如果XCode 7.3.1允许Swi

有一些相关的问题,但我没有足够的网站声誉评论现有的线程,迫使我开始一个新的。很抱歉

斯威夫特似乎没有真正的预处理器。使用#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完全不兼容,没有一种方法可以做到这一点

我找不到任何方法来做这件事

然而,有一个,自Swift 2.2以来就有一个;他们提前计划了这一意外事件:

所以,像这样(我不知道WCSession是什么,所以我使用了一个不同的例子):

编辑根据苹果公司的说法,Xcode 8允许向Swift传递任意条件编译标志:

活动编译条件
是一种新的生成设置,用于将条件编译标志传递给Swift编译器。此设置值的每个元素传递给以
-D
为前缀的
swiftc
,传递方式与
预处理器宏的元素传递给前缀相同的
clang
的方式相同。(22457329)


Swift 3的语法确实与Swift 2大不相同。如此之多,以至于试图用
#if
来覆盖它是行不通的,即使你有一个预处理器。预期的解决方案是将代码库转换为Swift 3(或将其转换为Swift 3)。试图维护一个为两者编译的非平凡代码库是一条死胡同(就像Swift 1和Swift 2一样)。@RobNapier我不能同意这一点。这在道德上可能不可取,但他们确实为此目的提供了有条件的编译,而且确实有效。我可以想象在什么情况下,转换成Swift 3需要逐步进行。@matt看到结果会很有趣,但从1到2,我发现在任何非平凡的代码库上都不实用。2到3是一个更大的变化,因为它重命名了很多东西。很难想象它能在非常小的代码片段之外工作。但时间会证明一切。@RobNapier说得对,但如果swift(…)
不存在,从1到2
;没有条件编译。我同意这对于一个非平凡的代码库来说是丑陋的,但我的代码库可能是平凡的。我有一个相当大的iOS应用程序是用Objective-C编写的,我在其中添加了一个非常小的Watchkit扩展,为此我决定学习Swift。我最近安装了XCode测试版,并将代码迁移到Swift 3,当时我开始遇到问题。为了确定这些问题是我的还是测试版造成的,我真的很想在XCode 7.3.1上运行它,但如果不恢复到Swift 2.2,就无法运行它——希望只是暂时的,一旦XCode 8退出测试版,我可以去掉#ifs
    #if swift(>=3.0)
        let screen = UIScreen.main()
    #else
        let screen = UIScreen.mainScreen()
    #endif