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 擴展就成功了。如此類推,可以讓代碼在兩個平臺之間最大限度的復用。
是不是很簡單呢?