2014-10-09 70 views
4

我想在使用iOS 8.1 SDK进行构建时有条件地编译一些代码,并且在使用8.0 SDK时编译一些不同的代码。在一个面向8.1 SDK的小型项目中(并且可以使用新的8.1版本的API),看起来#if指令忽略了常量。Swift编译仅适用于iOS 8.1 SDK的代码

println("__IPHONE_8_1 is defined to be \(__IPHONE_8_1)") 
#if __IPHONE_8_1 
    println("8.1") 
    #else 
    println("8.0") 
#endif 

上面的代码打印:

__IPHONE_8_1 is defined to be 80100 
8.0 

据对conditional compilation statements的文档,

SWIFT代码可以基于 构建配置评价被有条件地编译。构建配置包括下表中列出的文字truefalse值,命令行标志和平台测试 函数。您可以使用-D <#flag#>指定命令行 标志。

然后它谈到os()arch()功能,但没有关于SDK版本。

回答

0

当前Swift不支持从条件编译谓词引用常量。我对这个特定情况的解决方案是根据SDK版本定义不同的编译器标志。

在Xcode的构建设置下,转到其他Swift Flags,您可以在其中为不同的SDK设置标志。由于我的Xcode的安装并没有同时与8.0和8.1的SDK相关的,我用手工编辑的project.pbxproj文件:

"OTHER_SWIFT_FLAGS[sdk=iphoneos8.1]" = "-D DEBUG -D __IPHONE_8_1"; 
"OTHER_SWIFT_FLAGS[sdk=iphoneos8.0]" = "-D DEBUG"; 

在Xcode中,它看起来像: