Article

Using Delegates to Customize Object Behavior 委任先を使ってオブジェクト挙動をカスタマイズする

Respond to events on behalf of a delegator. 委任元に代わってイベントに応答します。

Overview 概要

You use delegates to interact with Cocoa objects that inform you of events in an app. あなたは委任先を使って、あるアプリの中のイベントについてあなたに告知するCocoaオブジェクトと相互作用します。

Adopt a Delegate Protocol 委任先プロトコルを採用する

Cocoa APIs often provide protocols that include delegate methods. When an event occurs—such as a user resizing a window—a class that's a delegator will detect the event and call delegate methods on the class you specify as the delegate. Delegate methods can customize how an app responds to an event. Cocoa APIは、しばしば委任先メソッドを含むプロトコルを提供します。イベントが発生する場合 — 例えばユーザがウインドウをリサイズするなど — 委任元であるクラスはイベントを検出します、そしてあなたが委任先として指定するクラス上で委任先メソッドを呼び出します。委任先メソッドは、どのようにアプリがイベントに応答するかをカスタマイズできます。

The example below adopts the NSWindowDelegate protocol and implements its window(_:willUseFullScreenContentSize:) method: 下の例は、NSWindowDelegateプロトコルを採用します、そしてそれのwindow(_:willUseFullScreenContentSize:)メソッドを実装します:


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

Check That Delegates Exist その委任先が存在するか確認する

The Cocoa delegation pattern doesn't require that delegates are instantiated. If you don't need to respond to events, you don't need to create a delegate. Before you call a method on an object's delegate, make sure that the delegate isn't nil. Cocoa委任パターンは、委任先がインスタンス化されることを要求しません。あなたがイベントに応答することを必要としないならば、あなたは委任先を作成する必要はありません。あなたがメソッドをオブジェクトの持つ委任先で呼び出す前に、委任先がnilでないことを確実にしてください。

The example below creates an NSWindow and uses optional chaining to check that the window's delegate exists before sending a message to the delegate. 下の例は、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))
}

See Also 参照

Common Patterns 共通パターン