12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift で NSColor と UIColor、NSImage と UIImage を同じソースで扱う

Posted at

前回の Swift で CSS3 の色を名前で参照する方法 のおまけとして書いた所を切り出して記事にしたいと思います。

Swift で iOS のコードと OS X のコードを共有した時ってあるかと思います。その際、時々問題になるのが、同様なクラスなのに iOS と OS X でプレフィックスが違うクラスの扱いです。iOS では、「UIColor, UIImage, UIView, UIViewController, UIBezierPath, UIResponder」「NSColor, NSImage, NSView, NSViewController, NSBezierPath, NSResponder」になっていて、以下のように import 先だけ、#if で切り分けても

.swift
#if os (OSX)
import Cocoa
#elseif os(iOS)
import UIKit 
#endif

実際に UIImage とか NSImage とかをいちいち切り分けるのは面倒の極みです。

.swift
class MyObject {
	#if os (OSX)
	var image: NSImage?
	#elseif os(iOS)
	var image: UIImage?
	#endif
}

そこで、まぁ知っていればどうってない事ですが、ちょっとした小技を紹介したいと思います。そのトリックは import の #if の切り分け時の所でこんな具合に書きます。

.swift
#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

勢い余って「...」までコピペしないでください。これで本体のコードの中でいちいち切り分けなくても大丈夫になり、コードの見渡しが良くなります。

.swift
class MyObject {
	var color: XColor?
	var image: XImage?
	// snip
}

基底クラスとしても使えます。

.swift
class MyImage: XImage {
	// snip
}

ただ、最も元のクラスに違いがある場合は、その違いを直接吸収できるわけではありませんので、工夫する必要があるかと思います。

.swift
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 のバージョンは以下の通りです。

.console
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?