2015-07-03 12 views
6

Ich habe eine einzige Codebasis, die mit Xcode 7 Beta und Xcode 6.4 kompatibel sein muss. Dies liegt daran, dass Beta-Tests und App Store-Builds mit der stabilen Version des Compilers und SDK erstellt werden sollten, aber ich habe auch iOS 9 Beta auf einem Telefon, das ich zum Testen verwende.Gibt es eine #ifdef, um in Swift zwischen Xcode 6.4 und Xcode 7 beta zu unterscheiden?

Dies war kein Problem mit Objective-C, aber jetzt, da ich ein bisschen Swift hinzufüge, finde ich es schwierig, die Kompatibilität mit beiden Versionen von Xcode aufrechtzuerhalten.

Was kann ich tun?

Ich weiß, Swift hat eine #ifdef-Direktive, aber gibt es #ifdefs als kann zwischen Swift 1.2 und 2.0 unterscheiden? Ich kann keine gültige Liste für Swift finden, außer für DEBUG, os und arch.

Hier ist ein Beispiel dafür, was ich meine:

#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 

Oder ein konkreteres Beispiel:

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 

    // ... 
} 
+1

"Ich habe eine einzige Codebasis, die mit Xcode 7 Beta und Xcode 6.4 kompatibel sein muss" Es wird nicht sein. Vergiss es. Dies sind zwei völlig verschiedene Versionen von Swift (und der Cocoa API); Sie können unmöglich Swift-Code schreiben, der für beide funktioniert. – matt

Antwort

2

nein, als Swift alle erlegt "definieren" Pfad kompilieren müssen. Sorry aber alte gute Zeiten von #ifdef sind weg

1

Das Problem ist nicht so ungewöhnlich. Wir sehen es jedes Mal, wenn wir mitten in einem schweren Code-Refactoring sind. Was kannst du tun? Verwenden Sie ein Versionierungssystem, z. Git.

Mit git:

Swift 1.2 (Xcode 6.4) - hält den alten Code zu Ihrer master Niederlassung

Swift 2.0 (Xcode 7.0) - setzt den migrierte Code auf einen neuen Zweig, z.B. features/swift20.

Nun, für eine Weile müssen Sie zwei Zweige halten, aber das sollte nicht schwer sein. Sie können Ihre Änderungen zu master hinzufügen und sie dann zu features/swift20 zusammenführen, lösen alle Kollisionen/Migrationen während der Zusammenführung.

Wenn Xcode 9 GM herauskommt, können Sie einfach features/swift20 in master zusammenführen, weil Sie Swift 1.2 nicht mehr benötigen.