2016-07-23 112 views
2

有一些相關的問題,但我沒有足夠的網站聲譽評論現有的線程,迫使我開始一個新的。對於那個很抱歉。任何方式在Swift 3中做真正的條件編譯?

看來Swift沒有一個真正的預處理器。解決方法是使用#if/#else/#endif,但這裏的問題是它不會隱藏編譯器中的「錯誤」部分,強制'true'和'false'部分在語法上是有效的。鑑於Swift 3在語法上與Swift 2不兼容,這很困難 - 有沒有人找到一種解決方法,可以創建可以在任一環境下編譯的代碼? (如果XCode 8測試版允許使用Swift 2.2,或者如果XCode 7.3.1允許使用Swift 3,那麼這也會給我一個解決方法)。

我試圖做的,舉個簡單的例子,就是像

#if SWIFT3  
    let session = WCSession.default() 
#else 
    let session = WCSession.defaultSession() 
#end 

我找不到任何方式做到這一點,似乎令人驚訝的是沒有一個如何完成Swift2語言完全不兼容的Swift3語法。

+0

Swift 3的語法確實與Swift 2非常不同。所以,即使你有一個預處理器,試圖用'#filter'覆蓋它也不會起作用。預期的解決方案是將代碼庫轉換爲Swift 3(或將其分配給Swift 3)。試圖維護一個爲兩者編譯的不重要的代碼庫都是死路一條(就像Swift 1和Swift 2一樣)。 –

+0

@RobNapier我完全同意這一點。這在道德上可能不太合理,但他們的確提供了有條件的編譯,而且確實有用。而且我可以想象轉換到Swift 3需要逐步進行的情況。 – matt

+0

@matt看起來很有意思,但是從1到2我沒有在任何非平凡的代碼基礎上找到實用的東西。 2到3是一個更大的變化,因爲它重新命名了很多東西。很難想象它能夠在非常小的代碼之外工作。但時間會證明。 –

回答

7

我找不到任何辦法做到這一點

然而,有一個,有一直之一,因爲雨燕2.2;他們計劃提前了整整這一意外:

https://github.com/apple/swift-evolution/blob/master/proposals/0020-if-swift-version.md

所以,像這樣的(我不知道WCSession是什麼,所以我用不同的例子):

#if swift(>=3.0) 
     let screen = UIScreen.main() 
    #else 
     let screen = UIScreen.mainScreen() 
    #endif 

編輯根據Apple的說法,Xcode 8允許將任意條件編譯標誌傳遞給Swift:

Active Compilation Conditions是一個新的構建設置將條件編譯標誌傳遞給Swift編譯器。該設置值的每個元素都以-D作爲前綴swiftc,與Preprocessor Macros的元素以相同的前綴傳遞給clang相同。 (22457329)

+0

謝謝,這確實有用! –