在iOS和MacOS之间共享代码 - NSTextField和UITextField

问题描述:

我有一个应用程序,两个平台之间基本相同,共享逻辑和对象名称。但是代码是不一样的,我想把它放在一起。在iOS和MacOS之间共享代码 - NSTextField和UITextField

我试图尽可能地巩固逻辑以使维护更容易。然而在iOS我用

result.text = valueString 

,并在MacOS上它的

result.stringValue = valueString 

有什么办法,我可以做我想做的:分享我的代码一切,除了用户界面的定义?我看过变色龙,但它似乎并没有延伸到这么远。

我找到了。显而易见真的,如果你知道具体的语法是什么...

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

有趣,但结果的类型必须是为了编译?我不明白这对你有什么帮助。它只是将问题进一步推回(到“结果”本身的声明)。它并没有最终“巩固”任何东西。 – matt

+0

所以我注意到了。理论是好的 - 但这意味着我可以在应用程序的两个版本之间复制和粘贴整个函数,并在其中包含#if块。我确切知道如何在Cobol中做到这一点! –

我会创建两个类都符合该协议作为一个文本访问:

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,您将访问特定于平台的类。