在 OS X (Objective-C) 和 iOS (Swift) 之间共享代码

Posted

技术标签:

【中文标题】在 OS X (Objective-C) 和 iOS (Swift) 之间共享代码【英文标题】:Sharing code between OS X (Objective-C) and iOS (Swift) 【发布时间】:2015-05-04 18:53:46 【问题描述】:

我有一个用 Objective-C 编写的 Mac 应用程序。现在我想制作它的 ios 版本,用 Swift 编写。

我从一开始就遵循 MVC 模型。

我想在两个平台上共享模型代码。现在我遇到了一个我无法解决的问题。在一个 Objective-C 模型类中,我使用 NSFont,它在 iOS 上不存在。使用UIFont 会给我一个未知的错误。 UIKit 在那里不可用。

我需要做什么才能在一节课中使用AppKitUIKit

这是我所做的:

#if TARGET_OS_IPHONE
UIFont* font;
#else 
NSFont* font;
#endif

感谢您的帮助!

【问题讨论】:

【参考方案1】:

浏览 WWDC 视频。在一段视频中,Apple 工程师解释了他们做了什么来获得 MacOS 和 iOS 之间常见的 Pages 和 Numbers 代码。那应该给你一些想法。

如果您在 Objective-C 中拥有庞大的代码库,我认为将其更改为 Swift 并没有任何直接优势。

对于您希望成员成为 NSFont 或 UIFont 的情况,您的方法根本不起作用。在头文件中的某个位置更容易

#if TARGET_OS_IPHONE
typedef UIFont MyFont;
#else 
typedef NSFont MyFont;
#endif

避免代码中只有 ifdefs。

【讨论】:

非常感谢您为我指明了正确的方向!我今天已经看过视频并重新检查了它。我也查看了 Lister 示例代码,现在它可以工作了!【参考方案2】:

简短的回答:你不能。您需要编写条件编译代码,使用 iOS 的 UIKit 和 Mac OS 的 AppKit。

【讨论】:

我想我知道你的意思,我做到了。我编辑了我的问题以显示一个示例。该代码给了我以下错误:使用未声明的标识符'UIFont' 那是因为你需要不同的头文件。

以上是关于在 OS X (Objective-C) 和 iOS (Swift) 之间共享代码的主要内容,如果未能解决你的问题,请参考以下文章

《Objective-C高级编程 iOS与OS X多线程和内存管理》读书笔记

Objective-C高级编程:iOS与OS X多线程和内存管理

编写高质量iOS与OS X代码的52个有效方法

《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》读书笔记(上)

《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》读书笔记(上)

一篇文章拿下《Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法》