Learn Swift / viva Cocoa


Learn Swift / 第14章  プロトコル


このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。

2016年1月20日

home  目次  前へ  次へ  mail


プロトコル

 プロトコル (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 の特徴の一つである、クロージャについて学習します。  


home  目次  前へ  次へ  mail


無断転載禁止
Copyright 2016. vivacocoa.jp All right reserved.