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了。
我有一个代码库需要与 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了。