【问题标题】:Is there an #ifdef to distinguish between Xcode 6.4 and Xcode 7 beta in Swift?Swift 中是否有 #ifdef 来区分 Xcode 6.4 和 Xcode 7 beta?
【发布时间】:2015-09-21 15:54:51
【问题描述】:

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

这对 Objective-C 来说不是问题,但是现在我添加了一些 Swift,我发现很难保持与两个版本的 Xcode 的兼容性。

我能做什么?

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

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

#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

    // ...
}

【问题讨论】:

  • "我有一个需要与 Xcode 7 beta 和 Xcode 6.4 兼容的单一代码库" 它不会。忘了它。这是两个完全不同的 Swift 版本(和 Cocoa API);你不可能编写同时适用于两者的 Swift 代码。

标签: ios swift conditional-compilation


【解决方案1】:

不,因为 Swift 规定所有“定义”路径都必须编译。 抱歉,#ifdef 的美好时光已经一去不复返了

【讨论】:

    【解决方案2】:

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

    使用 git:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2015-09-22
      相关资源
      最近更新 更多