2016-10-10 57 views
-2

我有一個應用程序,兩個平臺之間基本相同,共享邏輯和對象名稱。但是代碼是不一樣的,我想把它放在一起。在iOS和MacOS之間共享代碼 - NSTextField和UITextField

我試圖儘可能地鞏固邏輯以使維護更容易。然而在iOS我用

result.text = valueString 

,並在MacOS上它的

result.stringValue = valueString 

有什麼辦法,我可以做我想做的:分享我的代碼一切,除了用戶界面的定義?我看過變色龍,但它似乎並沒有延伸到這麼遠。

回答

-1

我找到了。顯而易見真的,如果你知道具體的語法是什麼...

#if os(iOS) 
    result.text = valueString 
#else 
    result.stringValue = valueString 
#endif 
+0

有趣,但結果的類型必須是爲了編譯?我不明白這對你有什麼幫助。它只是將問題進一步推回(到「結果」本身的聲明)。它並沒有最終「鞏固」任何東西。 – matt

+0

所以我注意到了。理論是好的 - 但這意味着我可以在應用程序的兩個版本之間複製和粘貼整個函數,並在其中包含#if塊。我確切知道如何在Cobol中做到這一點! –

0

我會創建兩個類都符合該協議作爲一個文本訪問:

protocol TextAccess { 
    func getText() -> String? 
} 

extension UITextView: TextAccess { 
    func getText() -> String? { 
     return text 
    } 
} 

extension NSTextField: TextAccess { 
    func getText() -> String? { 
     return stringValue 
    } 
} 

這樣的話,你只需要調用.getText()在任何類型上調用它們的特定訪問器。您可能需要將上面的代碼封裝在#if塊中,但這只是解決此問題的一種方法的粗略示例。

另一種方法是創建一個別名:

#if os(iOS) 
    typealias TextField = UITextField 
#endif 
#if os(macOS) 
    typealias TextField = NSTextField 
#endif 

您存取TextField,您將訪問特定於平臺的類。

相關問題