delegate ( 委派 ) 在 Cocoa 中,代表的是將物件負責要做的事交給另一個物件做的意思 。而UIApplication 物件就是一個例子,它代表 iOS 上的應用程式。這個物件需要知道應用程式被移到背景執行時,需要做些什麼事情:一個物件在執行時可以判斷另外一個物件是不是有能力回應一個方法。
假設物件 A 想讓物件 B 知道有件事及將要發生或是已經發生,而且物件 A 擁有一個參照到 B 物件的實例變數,這個指到物件 B 參照被稱為 delegate。當事件發生時,物件 A 就會去檢查它 delegate 物件 ( 也就是 B 物件 ),是否有回應這個事件的方法的實作。如果拿 UIApplication 的 delegate 來舉例,應用程式的 delegate 物件會詢問是否有實作 applicatuinDidEnterBackground 方法,如果有的話,這個方法就會立即被呼叫。
這樣的設計,讓我們可以同時 delegate 多個物件。舉一個例子,若一個物件能接受聲音播放及圖片物件的 delegate,那麼在相機拍照、播放聲音時,這個物件都會收到通知。
由於 MVC 模式是以充滿鬆散耦合為核心概念,所以它有助於將物件界面定義的非常嚴格,所以我們的應用程式中,一個物件對其他物件的行為要求就更清楚了。
delegate 所要用的訊息格式,通常會被清楚定義在協定裡。所我們物件想要能夠接受 AVAudioPlayer 物件的 delegate ,那就要符合 AVAudioPlayerDelegate 協定。
在 Swift 使用 delegate 是件容易的事:我們現在有兩個類別,而想要其中一個類別可以接受另一個的 delegate。
chihuahuaDelegate 方法會先檢查有沒有 house 可用的 TheSecurityDelegate,然後才執行他的 cuteDog方法,它使用了 Swift 的 optional chaining 功能來檢查工作,這功能是讓我們不用先對 optional 有值,表示 TheSecurityDelegate 存在,那麼就呼叫他的 cuteDog 方法,但如果 optional 為 nil ,那麼就什麼都不做。我們一樣也可以使物件間的鬆散耦合。