【Swift】Extensionしてますか?

pokepoke20160714185112_TP_V

こんにちは、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の書き方が機能の実装なので自然と機能別に作成することになり、結果として様々なプロジェクトで使い回す事ができるのもメリットです。

冒頭でも説明しましたが、列挙型やプロトコルにも機能を追加できるので今後はそっちも勉強していこうと思います!

Teruhiro Matsukawa
iOS/Androidの開発を担当してます。
日々、体脂肪率と奮闘中です。
糖質取りすぎダメ、絶対。

Egg Device Application

東京品川のスマホアプリ開発会社です。
一般アプリ、業務用アプリからVRまで開発可能。

ライター一覧

求人情報

スマホアプリ開発の
相談を受け付けています

メールでのご相談

お電話でのご相談
TEL 03-5422-7524
平日10:00~18:00