デリゲートとは、他のオブジェクトがプログラム中のイベントに遭遇したときに、そのオブジェクトに代わって、あるいは協調して行動するオブジェクトのことです。
重要: この記事を投稿したのが2021年12月03日(金)で自身の法人サイトの方でしたけれども、公式サイトの更新などでブログ系のメンテナンスが大変だったので、ここに過去の投稿の移動とこれからの記事を投稿をする予定です。
概要
デリゲートは、アプリ内のイベントを通知する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))
}
次の投稿では、さらにカスタム・デリケートの作り方の投稿をしたいと思います。