2016-05-10 52 views
1

我爲Xcode構建了一個插件,主要通過Alcatraz部署。該實用程序從GitHub獲取插件的源代碼,編譯它,如果成功,則將其安裝在正確的目錄中。它一直工作得很好,直到Xcode的7.3版本與Swift 2.2一起發佈。基於Xcode版本的有條件編譯

Swift 2.2引入了一種指定選擇器的新方法。以前,您將與函數的名稱提供一個字符串像這樣:

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

然而新方法使用#selector像這樣:

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

如果將我的代碼到新方法,那麼任何使用舊版Xcode(7.2.1及更早版本)的人都將無法使用我的插件,因爲它不知道新的#selector。我知道這一點,因爲我已將其轉換爲擺脫棄用警告,並從我的用戶那裏獲得反饋。然而,Xcode的下一個版本很可能會轉移到Swift 3,我將不得不做出這個改變。

所以我最喜歡的路徑是找到一種方法讓編譯器選擇適用於Xcode版本的代碼。像這樣的僞代碼。

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

我知道,有可以用來告訴版本,但也僅僅有2.2雨燕SWIFT推出()函數,如果我使用匯編將在Xcode中7.2.1及以下失敗。這使我在@selector函數中的位置與以前一樣。

另一種選擇是採取我即將發佈的版本,並使其成爲最後一個使用選擇器:「functionName:」方法。然後,我將爲GitHub預先編譯一份舊版Xcode的用戶手動下載和安裝的副本。

感謝您的幫助。

+0

對當前正在開發的語言維護傳統支持似乎不適用。這很少有什麼好處,沒有理由不在最新的Xcode/Swift版本上。 – Alexander

+0

我使用最新的Xcode/Swift,但插件代碼由全球數百人下載和編譯。我無法在開發環境中決定他們的選擇,所以我希望能夠在可能的情況下支持他們。他們可能有充分的理由不會離開不到一年的應用程序。我正在談論支持Xcode 7.2.1而不是版本4. – CanadianMacFan

+0

作爲一種語言,Swift正處於重大的發展階段。沒有任何東西是成立的,許多事情正在迅速發展,甚至像「數組」字面語法一樣基本。任何想快速理解源代碼和ABI不穩定性的人都會在很大程度上在接下來的一段時間內存在。支持一些無意義的東西。 – Alexander

回答

0

由於Swift支持條件編譯,因此您可以設置自己的條件。

使用類似#if SWIFT_2_0的東西,並在需要使用舊版Swift的項目中定義-D SWIFT_2_0