我想在使用iOS 8.1 SDK构建时有条件地编译一些代码,并在使用8.0 SDK时编译一些不同的代码。在一个针对8.1 SDK的小项目中(并且可以使用8.1新增的API),#if
指令似乎忽略了常量。
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代码可以根据评估条件进行编译 构建配置。构建配置包括文字
true
和false
值,命令行标志和平台测试 功能列于下表。您可以指定命令行 使用-D <#flag#>
的标志。
然后讨论os()
和arch()
函数,但没有关于SDK版本的内容。
答案 0 :(得分: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中,它看起来像: