Learn Swift / 第14章 プロトコル
このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。
プロトコル
プロトコル (protocol、議定書) は、クラスを拡張する方法の一つです。プロトコルは次のリストのように定義します。プレイグラウンドを開いて、試してみてください。
import Cocoa protocol Protocol { func sayHello() func sayBye() }protocol Protocol {プロトコルの定義は、protocol というキーワードで始めます。プロトコルの名前は、自由に決めることができますが、慣習として、大文字で、始めることになっています。プロトコルの中身は、{ と } の間に、記述しなければなりません。
func sayHello()プロトコルには、メソッドを定義します。プロトコルに定義されるメソッドには、内容を記述することはできません。{ と } も、記述することができません。また、プロトコルには、プロパティは定義できません。
プロトコルの採用
定義したプロトコルは、次のリストのように、クラスを定義する時に採用します。プロトコルを採用したクラスは、プロトコルに定義されているメソッドを、必ず実装しなければなりません。実装とは、メソッドの中身を記述することです。
import Cocoa protocol Protocol { func sayHello() func sayBye() } class ABC: Protocol { func sayHello() { print("こんにちは") } func sayBye() { print("さようなら") } }class ABC: Protocol {プロトコルを採用するには、クラス名の後に、: (colon、コロン) を記述します。そしてそのあとに、プロトコル名を記述します。定義するクラスに、スーパークラスがある場合は、クラス名 : スーパークラス名, プロトコル名と、先に、スーパークラスを記述します。なお、スーパークラスは、一つしか指定できませんが、プロトコルは、複数採用することができます。複数のプロトコルを採用する場合は、クラス名 : スーパークラス名, プロトコル1, プロトコル2 と , (comma、コンマ) で区切ります。
プロトコルを採用することによって、そのクラスに、どのようなメソッドが、実装されているのかが、はっきりとすることになります。
プロトコルのオプショナルメソッド
通常、プロトコルで定義されたメソッドは、そのプロトコルを採用したクラスで、必ず実装されなければなりません。しかし、プロトコルでメソッドを定義するときに、オプショナル (optional、選択自由) を指定することで、そのメソッドの実装は、プログラマの意思次第になります。つまり、必要と思われるときにだけ実装すればよいのです。なお、ここでいうオプショナルは、型の定義のオプショナルとは、別のものです。
なお現在、プロトコルメソッドの、オプショナル指定は、Objective-C 言語でのみ定義できます。コードリストは、割愛させていただきます。
デリゲート
ここまで、プロトコルの説明をしましたが、いま少し、プロトコルの必要性が、理解できないのではないだろうかと思います。
プロトコルを、プログラマが定義することは、ほとんどありません。しかし、Apple が提供しているフレームワーク (framework、クラスや関数の集まり) には、多くのプロトコルが定義されています。その代表が、データソース (datasorce) と、デリゲート (delegate、委任・委譲) と呼ばれるものです。
デリゲートプロトコルに定義されているメソッドは、すべてオプショナルなメソッドです。つまり、プログラマが、任意に実装できるメソッドです。そして、Apple が提供しているデリゲードメソッドは、すべて「イベント」と呼ばれるものです。
「イベント」とは、「アプリケーションが起動した」「ウィンドウが移動した」「ウィンドウが閉じられた」などの、何かの動作が起こった時に発生するものです。
デリゲートメソッドについては、デリゲート (委任) という言葉の意味を重視した説明が、多く行われています。しかし、Apple から提供されているデリゲーメソッドは、すべてイベントであるということを、理解しておくことは、とても重要です。
デリゲートメソッドの実例
Part1. アプリケーション作成の概要で、作成した Hello アプリケーションで、デリゲートの実例を見てみましょう。AppDelegate.swift のコードは、次のリストのようになっています。
import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool { return true } func applicationDidFinishLaunching(aNotification: NSNotification) { // Insert code here to initialize your application } func applicationWillTerminate(aNotification: NSNotification) { // Insert code here to tear down your application } }この AppDelegate クラスに実装されているメソッドは、すべてデリゲートメソッドです。
class AppDelegate: NSObject, NSApplicationDelegate {AppDelegate クラスは、NSObject クラスを継承して、NSApplicationDelegate プロトコルを採用しています。
この AppDelegate に実装されている、次のメソッドは、すべて、NSApplicationDelegate で定義されている、オプショナルなメソッドです
applicationShouldTerminateAfterLastWindowClosed
applicationDidFinishLaunching
applicationWillTerminate試しに、次のリストのように、applicationDidFinishLaunching と、applicationWillTerminate を、コメントアウトして (コメント化して、コードを無効にすること) 、アプリケーションを実行します。実装のない、デリゲートメソッドなので、アプリケーションの振る舞いは一切変わりません。
なお、/* と */ に囲まれた部分は、複数行であっても、コメントとなります。
import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool { return true } /* func applicationDidFinishLaunching(aNotification: NSNotification) { // Insert code here to initialize your application } func applicationWillTerminate(aNotification: NSNotification) { // Insert code here to tear down your application } */ }
お疲れ様でした。
次章では、Swift の特徴の一つである、クロージャについて学習します。
無断転載禁止 Copyright 2016. vivacocoa.jp All right reserved.