前回の Swift で CSS3 の色を名前で参照する方法 のおまけとして書いた所を切り出して記事にしたいと思います。
Swift で iOS のコードと OS X のコードを共有した時ってあるかと思います。その際、時々問題になるのが、同様なクラスなのに iOS と OS X でプレフィックスが違うクラスの扱いです。iOS では、「UIColor
, UIImage
, UIView
, UIViewController
, UIBezierPath
, UIResponder
」「NSColor
, NSImage
, NSView
, NSViewController
, NSBezierPath
, NSResponder
」になっていて、以下のように import 先だけ、#if
で切り分けても
#if os (OSX)
import Cocoa
#elseif os(iOS)
import UIKit
#endif
実際に UIImage
とか NSImage
とかをいちいち切り分けるのは面倒の極みです。
class MyObject {
#if os (OSX)
var image: NSImage?
#elseif os(iOS)
var image: UIImage?
#endif
}
そこで、まぁ知っていればどうってない事ですが、ちょっとした小技を紹介したいと思います。そのトリックは import の #if
の切り分け時の所でこんな具合に書きます。
#if os (OSX)
import Cocoa
typealias XColor = NSColor
typealias XImage = NSImage
typealias XView = NSView
typealias XViewController = NSViewViewController
...
#elseif os(iOS)
import UIKit
typealias XColor = UIColor
typealias XImage = UIImage
typealias XView = UIView
typealias XViewController = UIViewViewController
...
#endif
勢い余って「...」までコピペしないでください。これで本体のコードの中でいちいち切り分けなくても大丈夫になり、コードの見渡しが良くなります。
class MyObject {
var color: XColor?
var image: XImage?
// snip
}
基底クラスとしても使えます。
class MyImage: XImage {
// snip
}
ただ、最も元のクラスに違いがある場合は、その違いを直接吸収できるわけではありませんので、工夫する必要があるかと思います。
class MyView: XView {
#if os (OSX)
func layout() {
super.layout()
self._layoutSubviews()
}
#elseif os(iOS)
func layoutSubviews() {
super.layoutSubviews()
self._layoutSubviews()
}
#endif
private func _layoutSubviews() {
// your layout code
}
}
いかがでしたでしょうか。それでは、皆様、Have a nice coding...
[環境]swift のバージョンは以下の通りです。
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)