4

我想在使用 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

根据条件编译语句的文档,

可以根据构建配置的评估有条件地编译 Swift 代码。构建配置包括下表中列出的文字true 和值、命令行标志和平台测试函数。false您可以使用-D <#flag#>.

然后它谈论os()arch()功能,但对 SDK 版本一无所知。

4

1 回答 1

1

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

在 Xcode 的构建设置下,转到其他 Swift 标志,您可以在其中为不同的 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 中它看起来像:

于 2014-10-09T21:44:25.367 回答