在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
答
我会创建两个类都符合该协议作为一个文本访问:
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
,您将访问特定于平台的类。
有趣,但结果的类型必须是为了编译?我不明白这对你有什么帮助。它只是将问题进一步推回(到“结果”本身的声明)。它并没有最终“巩固”任何东西。 – matt
所以我注意到了。理论是好的 - 但这意味着我可以在应用程序的两个版本之间复制和粘贴整个函数,并在其中包含#if块。我确切知道如何在Cobol中做到这一点! –