2016-05-10 10 views
1

主にアルカトラズによって展開されるXcodeのプラグインを構築しました。このユーティリティは、GitHubからプラグインのソースを取得し、コンパイルし、正常に実行された場合は適切なディレクトリにインストールします。 Xcodeのバージョン7.3がSwift 2.2でリリースされるまではかなりうまくいっています。Xcodeバージョンに基づく条件付きコンパイル

Swift 2.2では、セレクタを指定する新しい方法が導入されました。私は新しいの上で、私のコードを変換する場合

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

:新しい方法はとても似#selectorを使用していますが

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

:以前は、このような関数の名前で文字列を指定します以前のバージョンのXcode(7.2.1以前)を使用している人は、新しい#selectorについて知らないので、自分のプラグインを使用することはできません。これを知っているので、私はそれを非難の警告を取り除くために変換し、ユーザーからのフィードバックを得ました。しかし、Xcodeの次のバージョンがSwift 3に移行する可能性が高いので、この変更を行う必要があります。

私の好ましい方法は、コンパイラにXcodeのバージョンに該当するコードを選択させる方法を見つけることです。この擬似コードのようなもの。私はコンパイルが以下のXcode 7.2.1およびに失敗することを使用している場合

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

私はバージョンを伝えるために使用することができますが、それだけスウィフト2.2で導入されましたSWIFT()関数があることを知っています。これにより、前と同じ場所に@selector関数が残されます。

もう一つの選択肢は、私がやっているリリースを取って、セレクタ "functionName:"メソッドで最後にすることです。古いバージョンのXcodeを手動でダウンロードしてインストールするために、GitHubにあらかじめコンパイルしたものをコピーします。

ありがとうございました。

+0

現在開発中の言語でレガシーサポートを維持することはお勧めできません。これから得ることはほとんどありません。最新のXcode/Swiftバージョンにならない理由はありません。 – Alexander

+0

私は最新のXcode/Swiftを使用していますが、プラグインコードは世界中の何百人もの人がダウンロードしてコンパイルしています。私は開発環境での選択を指示することができず、可能であればサポートしたいと考えています。彼らは1年未満のアプリケーションから離脱しないのに十分な理由があるかもしれません。 Xcode 7.2.1ではバージョン4ではなく、サポートしています。 – CanadianMacFan

+0

Swiftは、言語そのものとして、大きく発展しています。石には何も設定されておらず、多くのことが素早く動いています。ソースコードとABIの不安定さを素早く理解したい人は、次の少しの間、大部分が存在します。無意味なものをサポートする。 – Alexander

答えて

0

Swiftは条件付きコンパイルをサポートしているため、独自の条件を設定できます。

#if SWIFT_2_0のようなものを使用し、古いバージョンのSwiftを使用するプロジェクトで-D SWIFT_2_0を定義します。

関連する問題