テックノート

デリゲートの使用

オブジェクトの動作をカスタマイズするためのデリゲートの使用し、デリゲーターに代わってイベントに応答します。
代表者 ロジャース リチャード 投稿者: ロジャース リチャード
xCode 6+ iOS 8+ OSX v10.10+ Swift

デリゲートとは、他のオブジェクトがプログラム中のイベントに遭遇したときに、そのオブジェクトに代わって、あるいは協調して行動するオブジェクトのことです。

概要

デリゲートは、アプリ内のイベントを通知するCocoaオブジェクトとのやり取りに使用します。

Delegate Protocolの採用

CocoaのAPIには、デリゲートメソッドを含むプロトコルが用意されていることが多い。ユーザーがウィンドウのサイズを変更するなどのイベントが発生すると、デリゲータであるクラスがそのイベントを検出し、デリゲートとして指定されたクラスのデリゲートメソッドを呼び出します。デリゲートメソッドは、アプリがイベントに反応する方法をカスタマイズすることができます。

以下の例では、NSWindowDelegateプロトコルを採用し、そのwindow(_:willUseFullScreenContentSize:)メソッドを実装しています。

class MyDelegate: NSObject, NSWindowDelegate {
    func window(_ window: NSWindow, willUseFullScreenContentSize proposedSize: NSSize) -> NSSize {
        return proposedSize
    }
}

デリケートの存在を確認する

Cocoaのデリゲーションパターンでは、デリゲートをインスタンス化する必要はありません。イベントに応答する必要がない場合は、デリゲートを作成する必要はありません。オブジェクトのデリゲートのメソッドを呼び出す前に、デリゲートがnilでないことを確認してください。

以下の例では、NSWindow を作成し、メッセージをデリゲートに送信する前に、ウィンドウのデリゲートが存在するかどうかをチェックするために、オプションのチェイニングを使用しています。

let myWindow = NSWindow(
    contentRect: NSRect(x: 0, y: 0, width: 5120, height: 2880),
    styleMask: .fullScreen,
    backing: .buffered,
    defer: false
)

myWindow.delegate = MyDelegate()
if let fullScreenSize = myWindow.delegate?.window(myWindow, willUseFullScreenContentSize: mySize) {
    print(NSStringFromSize(fullScreenSize))
}