アプリ開発日誌
2016.07.22
【Swift】Extensionしてますか?
こんにちは、iOS開発担当の松川です。
近頃ずっと話題になっているポケモンGOですが、本日ついに日本でリリースされましたね!
卵を孵化させるためには、時速10km以下で移動しないとカウントされないみたいなので今日からウォーキングする人が増えそうですねー。
歩きスマホだけ注意しましょう・・・!
さて本題ですが、今回はSwiftのExtension(拡張)という機能について書きたいと思います。
さっそくいってみましょー。
Extensionとは?
Swiftでは既存のクラス・構造体・列挙型・プロトコルに新しい機能を追加する事ができ、この仕組みをExtension(拡張)と呼びます。Objective-Cにもカテゴリといって既存クラスにメソッドを追加できる機能がありますが、カテゴリで追加できるのはクラスのみに限定されています。尚、Extensionとカテゴリのどちらにも言えますが既存のメソッドをオーバーライドする事はできません。あくまで機能を追加することが目的となります。
ファイルの命名
僕はExtensionのファイルを作成する際は、「拡張する型名+Extension」みたいに命名してますね。
一般的に+〜と書くのがよさそうです。
書き方
追加したい型名の前にextensionと記述
extension SampleClass {
// 新規に追加するメソッドやプロトコルへの適応
}
例えばUIColorクラスに、16進数のカラーコードから作成してくれるようなメソッドを追加してみましょう。Extensionを定義すると、追加した型の全てのインスタンスで使用できるようになります。
extension UIColor {
// 16進数の文字列からUIColorを作成
static func fromHex(strHex : NSString, alpha : CGFloat) -> UIColor {
let newHex = strHex.stringByReplacingOccurrencesOfString("#", withString: "")
let scanner = NSScanner(string: newHex as String)
var color: UInt32 = 0
// 不正な文字列
if !scanner.scanHexInt(&color) {
return UIColor.whiteColor()
}
let r = CGFloat((color & 0xFF0000) >> 16) / 255.0
let g = CGFloat((color & 0x00FF00) >> 8) / 255.0
let b = CGFloat(color & 0x0000FF) / 255.0
return UIColor(red:r, green:g, blue:b, alpha:alpha)
}
}
使用例
let color = UIColor.fromHex("#9728b2", alpha: 1)
self.view.backgroundColor = color
他にもViewController内のprotcolの実装を書くときにExtensionを使用すると見通しがよくなります
// Before
class SampleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIWebViewDelegate {
self.tableView.delegate = self
self.tableView.dataSource = self
self.webView.delegate = self
// MARK: UITableView delegate, dataSource
....
// MARK: UIWebView delegate
....
}
// After
class SampleViewController: UIViewController {
self.tableView.delegate = self
self.tableView.dataSource = self
self.webView.delegate = self
}
extension SampleViewController: UITableViewDelegate, UITableViewDataSource {
...
}
extension SampleViewController: UIWebViewDelegate {
...
}
まとめ
以前の僕はObjective-Cの時にカテゴリを全然使用していなかったので、Extensionを知ったときは衝撃でしたね。
Extensionは名前の通り既存クラスの拡張のみなので、他人のソースコードを改修する時にも便利です。
またExtensionの書き方が機能の実装なので自然と機能別に作成することになり、結果として様々なプロジェクトで使い回す事ができるのもメリットです。
冒頭でも説明しましたが、列挙型やプロトコルにも機能を追加できるので今後はそっちも勉強していこうと思います!