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 扩展就成功了。如此类推,可以让代码在两个平台之间最大限度的复用。
是不是很简单呢?