プロトコルとエクステンション (2/4)
作成:2014-11-08 11:07
更新:2014-11-08 11:07
更新:2014-11-08 11:07
■プロトコルを使ってみよう
では、実際にプロトコルを使った簡単なサンプルを作ってみましょう。下のリスト欄に簡単なサンプルを挙げておきました。
ここでは、MyProtocolというプロトコルを定義し、そこにデータを出力するprintDataというメソッドを用意してあります。そしてこのプロトコルを実装したクラスとして「PersonData」と「MemoData」を用意しました。PersonDataは個人情報を管理するもので、MemoDataはメモを保管するものです。どちらもまったく継承関係にはなく、用意されているプロパティも違います。
クラス定義の後で、これらを利用した簡単な処理があります。PersonDataとMemoDataを配列にまとめ、繰り返しで内容をすべて出力しています。
ここでは、MyProtocolの配列を作り、そこにPersonDataとMemoDataを保管しています。プロトコルは、クラス等と同じように型(タイプ)として指定することができるのです。
MyProtocol配列には、MyProtocolを実装したクラスのインスタンスならばどんなものでも入れることができます。そして、MyProtocolにキャストされたインスタンスから、forの中でprintDataを呼び出しているわけですね。
このように「プロトコルのインスタンスにキャストし、メソッドを呼び出す」というやり方をすることで、PersonDataとMemoDataという、継承関係も何もない、まったく無関係なクラスをまとめて処理することができるようになるのです。
ここでは、MyProtocolというプロトコルを定義し、そこにデータを出力するprintDataというメソッドを用意してあります。そしてこのプロトコルを実装したクラスとして「PersonData」と「MemoData」を用意しました。PersonDataは個人情報を管理するもので、MemoDataはメモを保管するものです。どちらもまったく継承関係にはなく、用意されているプロパティも違います。
クラス定義の後で、これらを利用した簡単な処理があります。PersonDataとMemoDataを配列にまとめ、繰り返しで内容をすべて出力しています。
ここでは、MyProtocolの配列を作り、そこにPersonDataとMemoDataを保管しています。プロトコルは、クラス等と同じように型(タイプ)として指定することができるのです。
MyProtocol配列には、MyProtocolを実装したクラスのインスタンスならばどんなものでも入れることができます。そして、MyProtocolにキャストされたインスタンスから、forの中でprintDataを呼び出しているわけですね。
このように「プロトコルのインスタンスにキャストし、メソッドを呼び出す」というやり方をすることで、PersonDataとMemoDataという、継承関係も何もない、まったく無関係なクラスをまとめて処理することができるようになるのです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
protocol MyProtocol { func printData () } class PersonData: MyProtocol { var name:String = "" init(name:String) { self.name = name } func printData() { println("[name: \(name).]") } } class MemoData: MyProtocol { var content:String = "" init(content:String) { self.content = content } func printData() { println(content) } } var data:[MyProtocol] = [] data.append(PersonData(name: "山田太郎")) data.append(MemoData(content: "明日9時から会議")) for obj in data { obj.printData() }
※関連コンテンツ