2016-05-10 20 views
1

Ich habe ein Plug-in für Xcode erstellt, das hauptsächlich über Alcatraz bereitgestellt wird. Dieses Dienstprogramm packt die Quelle für mein Plug-In von GitHub, kompiliert es und installiert es, falls erfolgreich, im richtigen Verzeichnis. Es hat recht gut geklappt, bis Version 7.3 von Xcode mit Swift 2.2 veröffentlicht wurde.Bedingtes Kompilieren basierend auf Xcode-Version

Swift 2.2 führte eine neue Art der Auswahl von Selektoren ein. Zuvor würden Sie eine Zeichenfolge mit dem Namen der Funktion wie diese liefern:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "applicationFinishedLoading:", name: NSApplicationDidFinishLaunchingNotification, object: nil) 

jedoch die neue Methode den #selector wie so verwendet:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ColorSenseRainbow.applicationFinishedLoading(_:)), name: NSApplicationDidFinishLaunchingNotification, object: nil) 

Wenn ich meinen Code auf den neuen konvertieren Methode, dann können Leute, die frühere Versionen von Xcode (7.2.1 und älter) verwenden, mein Plug-in nicht verwenden, weil es den neuen #Selector nicht kennt. Ich weiß das, weil ich es konvertiert habe, um die Verwarnungswarnungen los zu werden, und ich habe Feedback von meinen Benutzern erhalten. Es ist jedoch wahrscheinlich, dass die nächste Version von Xcode zu Swift 3 wird und ich muss diese Änderung vornehmen.

Also ist mein bevorzugter Weg, einen Weg zu finden, den Compiler den Code zu wählen, der für die Version von Xcode anwendbar ist. So etwas wie dieser Pseudocode.

#if (XCode_Version >= 7.3) 
    // use @selector (ThisClass.functionName) 
#else 
    // use selector: "functionName:" 
#endif 

Ich weiß, dass es rasche ist() Funktion, die verwendet werden kann, um die Version zu sagen, aber das war nur mit Swift 2.2 eingeführt und wenn ich, dass die Zusammenstellung auf Xcode 7.2.1 und unten fehl. Dies lässt mich an der gleichen Stelle wie zuvor mit der @ Selector-Funktion.

Die andere Möglichkeit ist, die Freigabe zu nehmen, die ich mache, und die letzte mit der Methode selectorator: "functionName:" zu machen. Ich werde dann eine Kopie davon auf GitHub vorkompiliert haben, damit Benutzer älterer Versionen von Xcode manuell herunterladen und installieren können.

Danke für Ihre Hilfe.

+0

Die Beibehaltung der alten Unterstützung für eine Sprache, die sich gerade in der Entwicklung befindet, scheint nicht ratsam zu sein. Es gibt wenig zu gewinnen, es gibt keinen Grund, nicht auf der neuesten Xcode/Swift-Version zu sein. – Alexander

+0

Ich bin auf dem neuesten Xcode/Swift, aber der Plug-in-Code wird von Hunderten von Menschen auf der ganzen Welt heruntergeladen und zusammengestellt. Ich bin nicht in der Lage, ihre Wahl in der Entwicklungsumgebung zu diktieren und deshalb möchte ich in der Lage sein, sie wenn möglich zu unterstützen. Sie haben möglicherweise gute Gründe dafür, eine Bewerbung, die weniger als ein Jahr alt ist, nicht abzulegen. Ich spreche über die Unterstützung von Xcode 7.2.1 nicht Version 4. – CanadianMacFan

+0

Swift, als eine Sprache selbst, ist stark in der Entwicklung. Nichts ist in Stein gemeißelt, und viele Dinge bewegen sich schnell, selbst Dinge, die so grundlegend sind wie die 'Array'-Literalsyntax. Jeder, der schnell Quellcode und ABI-Instabilität schreiben will, wird für die nächste Weile in hohem Maße existieren. Etwas unterstützen, das unsinnig ist. – Alexander

Antwort

0

Da Swift das bedingte Kompilieren unterstützt, können Sie Ihre eigenen Bedingungen festlegen.

Verwenden Sie etwas wie #if SWIFT_2_0 und definieren Sie -D SWIFT_2_0 in einem Projekt, das eine ältere Version von Swift verwenden muss.

Verwandte Themen