もくじ
どうもこんにちは。iOSをメインに開発しているロッキーカナイです。
今日はSwiftのextensionについて使用方法やメリットなどまとめてみたいと思います。
extensionとは
既存のクラスや構造体などに、メソッドやプロパティを追加で定義を可能にする、機能拡張のことです。
例えば、Viewの背景をピンク色にしたいとします。ただ、他のViewでもピンク色を使う場合、汎用的にピンク色を定義しておきたいと考えます。そこでextensionを利用します。
色を管理しているUIColorクラスにはピンク色のメンバーは存在していないので、UIColorクラスを拡張してピンク色を追加します。
import UIKit
extension UIColor {
class var pink: UIColor {
return UIColor.init(red: 1.0, green: 0.7, blue: 0.8, alpha: 1.0)
}
}
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let pinkColor : UIColor = UIColor.pink
self.view.backgroundColor = pinkColor
}
}
これにより、他のクラスでも UIColor.pink とすればピンク色が取得できます。これがextensionになります。
extensionのメリット
- 既存のクラスや構造体に機能拡張できる
- クラスや構造体だけでなく、enum、データ型などあらゆるものに可能
クラスの可読性を上げるという使い方
プロトコルを切り離す
extensionは、他にもクラスの可読性を上げるという使い方があります。
みなさまはUIPageViewControllerを継承したクラスを定義する際にはどのようにしますでしょうか?
class PageViewController: UIPageViewController, UIPageViewControllerDataSource {
override func viewDidLoad() {
...
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
...
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
...
}
}
「class クラス名 : スーパークラス名, プロトコル名」とすると思うのですが、プロトコルを切り離す事で、クラス定義とプロトコル定義を区切り可読性を上げる方法があります。
import UIKit
class PageViewController: UIPageViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension PageViewController : UIPageViewControllerDataSource {
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
...
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
...
}
}
プロトコルを切り離す事によるメリット
- 明示的に別処理と分かりやすくなり可読性が上がる
- ソースコードの肥大化の防止ができる
まとめ
今回はextensionで機能拡張する方法、可読性を上げる方法を紹介しました。
積極的にextensionを使用し、バグの少なく可読性の高いコードにするように心がけて行きましょう!