Swift 中是否有#ifdef 来区分Xcode 6.4 和Xcode 7 beta?

Is there an #ifdef to distinguish between Xcode 6.4 and Xcode 7 beta in Swift?

我有一个代码库需要与 Xcode 7 beta 和 Xcode 6.4 兼容。这是因为 Beta 测试和 App Store 构建应该使用编译器和 SDK 的稳定版本构建,但我在用于测试的 phone 上也有 iOS 9 beta。

Objective-C 没有问题,但现在我添加了一些 Swift,我发现很难保持与 [=] 两个版本的兼容性29=].

我能做什么?

我知道 Swift 有一个 #ifdef 指令,但是是否有可以区分 Swift 1.2 和 2.0 的 #ifdef?我找不到 Swift 的有效列表,除了 DEBUG、os 和 arch.

这是我的意思的一个例子:

#ifdef __IPHONE_9_0
    some Swift code that works in Swift 2.0 but won't compile in Swift 1.2
#else
    some Swift code that works in Swift 1.2 but won't compile in Swift 2.0
#endif

或者更具体的例子:

public final class MessageParser : NSObject {

    #ifdef __IPHONE_9_0
    static let sharedHashtagRegex = try! NSRegularExpression(pattern:"(^|\W)(#|\uFF03)(\w*\p{L}\w*)", options:[]);
    #else
    static let sharedHashtagRegex = NSRegularExpression(pattern:"(^|\W)(#|\uFF03)(\w*\p{L}\w*)", options:nil, error:nil)!
    #endif

    // ...
}

不,因为 Swift 强制所有 "define" 路径必须编译。 抱歉,#ifdef 的美好时光已经一去不复返了

这个问题并不少见。每当我们进行繁重的代码重构时,我们都会看到它。你能做什么?使用版本控制系统,例如git.

与git:

Swift 1.2 (Xcode 6.4) - 将旧代码保留在您的 master 分支

Swift 2.0 (Xcode 7.0) - 将迁移后的代码放到一个新的分支,例如features/swift20.

现在,有一段时间您将不得不维护两个分支,但这应该不难。您可以将更改添加到 master,然后将它们合并到 features/swift20,解决合并期间的所有 collisions/migrations。

当Xcode 9 GM出来时,你可以将features/swift20合并到master中,因为你不再需要Swift 1.2了。