填平macOS和iOS之间的鸿沟 - Swift篇

tags:开发随笔

上次写了一篇填平macOS和iOS之间的鸿沟,总结了在macOS和iOS之间共享代码的设计和实现,是基于Objective-C 的。

自从Swift诞生之后,关于Objective-C和Swift之间优劣对比的讨论就从没间断。

其实两种语言我都在用。Objective-C用的多一些,Swift稍微少一些。刚从XCode6.x 升级到XCode 7.X的时候,曾经为Swift编译后的超大的体积严重的郁闷了一阵子,还愤愤的把MarkNote中原先用Swift写的一部分代码完全用Objective-C重新实现了一遍。

不过新的应用,我基本上都是选择用Swift直接写了。从之前的事情之后,不太喜欢混编了。要么用OC,要么用Swift。

Swift编译技术一直在改进,不过依然有不少问题。包括编译慢等等。更重要的一个原因是,在一个工程中用两种语言写代码,一会OC,一会Swift,对大脑的刺激也是很大的,说不定会增加精神分裂的可能性呢,呵呵。

最近又在做一个既有mac端又有iOS端的应用。于是,老问题又来了,如何用Swift写即支持macOS,又支持iOS的代码?

我的策略还是类似的:

  • 使用Preprocessor directives来做判断OS;
  • 使用typealias来区分引用Cocoa或者UIKit中的类;

说起来比较抽象,还是看代码吧。

比如,我写了一个NSColor的extension:

import Foundation
import Cocoa
extension NSColor {
    class func colorWithHex(
//实现略

现在要让它同时也支持UIColor,那么代码是这样的:

import Foundation
#if os(OSX)
    import Cocoa
    typealias BaseColor = NSColor
#elseif os(iOS)
    import UIKit
    typealias BaseColor = UIColor
#endif
extension BaseColor {
    class func colorWithHex(
//实现略

经过简单的处理,一个同时支持macOS和iOS的Color 扩展就成功了。如此类推,可以让代码在两个平台之间最大限度的复用。

是不是很简单呢?

推荐阅读更多精彩内容