Swift2.0で追加されたprotocol extensionsを試してみたのでそのメモです。
protocol extensionsとは
プロトコルにメソッドを追加できる機能です。
下のようにextension
を使ってprotocol
にメソッドを追加します。
protocol MyProtocol { func aaa() } extension MyProtocol { func bbb() { print("AAA") } }
protocolとは
Javaで言うInterfaceです。
下のようにメソッドの宣言をして利用します。
protocol MyProtocol { func aaa() }
protocol extensionsの使い方
先ほど書いた通りextension
を使ってメソッドの追加をします。
protocol MyProtocol {} extension MyProtocol { func aaa() { print("AAA") } } class MyClass: MyProtocol {} MyClass().aaa()
protocol
に直接メソッドを追加する事はできません。
メソッドの定義はextension
中で行う必要があります。
protocol MyProtocol { func aaa() { print("AAA") } // これはエラーになる }
extension
中は逆に宣言だけする事はできません。
protocol MyProtocol {} extension MyProtocol { func ccc() // これもエラー }
extension
なのでインスタンス変数の定義もできません。
protocol MyProtocol {} extension MyProtocol { var a: Int? // これもエラー }
protocol
中で宣言したメソッドをextensions
で実装する事もできます。
そうするとクラス中でメソッドの実装をする必要がなくなります。
protocol MyProtocol { func aaa() } extension MyProtocol { func aaa() { print(222) } } class MyClass: MyProtocol {} // aaaの実装を書かなくて良い MyClass().aaa()
クラス中で実装すれば、そちらが呼ばれます。
protocol MyProtocol { func aaa() } extension MyProtocol { func aaa() { print(222) } // これは呼ばれない } class MyClass: MyProtocol { func aaa() { print(111) } // こっちが呼ばれる } MyClass().aaa()
UITableViewDataSource
のようなUIKitのプロトコルを拡張する事もできました。
import Foundation import UIKit extension UITableViewDataSource { func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } }
classの中からextensionの実装を呼ぶ方法は見つかりませんでした。
protocol MyProtocol { func aaa() } extension MyProtocol { func aaa() { print(222) } } class MyClass: MyProtocol { func aaa() { super.aaa() } // これはエラー }