スタッフブログ

STAFF BLOG

アプリ開発日誌

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

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

BACK

お問合せ

イーディーエーに興味をお持ちいただいて
ありがとうございます!
スマホアプリに関するご相談、
お見積りや弊社へのご質問など、
お気軽にお問い合わせください。
担当者より折り返しご連絡させていただきます。

    お名前必須
    会社名
    メールアドレス必須
    電話番号必須
    お問合わせ種別必須
    お問合わせ内容必須

    アンケートにご協力ください。
    弊社サイトへはどのようにしてアクセスされましたか?

    個人情報のお取扱いに関する同意事項

    1.事業者の氏名又は名称

    株式会社イーディーエー

    2.個人情報保護管理者の氏名又は職名、所属及び連絡先

    個人情報保護管理者 小宮 保人
    Mail:[email protected]

    3.取得した個人情報の利用目的

    当フォームで取得した個人情報は、お問い合わせに関する回答のために利用し、目的外利用はいたしません。

    4.弊社が取得した個人情報の第三者への委託、提供について

    弊社は、ご本人に関する情報をご本人の同意なしに第三者に委託または提供することはありません。

    5.個人情報保護のための安全管理

    弊社は、ご本人の個人情報を保護するための規程類を定め、従業者全員に周知・徹底と啓発・教育を図るとともに、その遵守状況の監査を定期的に実施いたします。
    また、ご本人の個人情報を保護するために必要な安全管理措置の維持・向上に努めてまいります。

    6.個人情報の開示・訂正・利用停止等の手続

    ご本人が、弊社が保有するご自身の個人情報の、利用目的の通知、開示、内容の訂正、追加又は削除、利用の停止、消去及び第三者への提供の停止を求める場合には、下記に連絡を頂くことで、対応致します。

    株式会社イーディーエー 個人情報お問合せ窓口
    〒106-0032 東京都港区六本木7丁目14番23 ラウンドクロス六本木4F
    TEL:03-5422-7524 FAX:03-5422-7534
    Mail:[email protected]

    7.ご提供いただく情報の任意性

    個人情報のご提供は任意ですが、同意を頂けない場合には、第3項にあります利用目的が達成できない事をご了承いただくこととなります。

    8.弊社Webサイトの運営について

    弊社サイトでは、ご本人が弊社Webサイトを再度訪問されたときなどに、より便利に閲覧して頂けるよう「クッキー(Cookie)」という技術を使用することがあります。これは、ご本人のコンピュータが弊社Webサイトのどのページに訪れたかを記録しますが、ご本人が弊社Webサイトにおいてご自身の個人情報を入力されない限りご本人ご自身を特定、識別することはできません。
    クッキーの使用を希望されない場合は、ご本人のブラウザの設定を変更することにより、クッキーの使用を拒否することができます。その場合、一部または全部のサービスがご利用できなくなることがあります。