Swift押さえておきたい構文 「Delegate」で”できる事”
エンジニア歴の長い筆者がいろんな言語を使用してきて、他の言語と異なる気になったSwiftで押さえておきたい構文を「なにが出来るの?」といった視点で紹介していきます。今回はDelegateについて公式サイトの説明を使用しながら解りやすく解説していきます
Deligate?
Delegateは、クラスまたは構造体がその処理の一部を別の型のインスタンスに引渡す(または委任する)ことを可能にするデザインパターンで、このパターンは委任された責任をカプセル化するプロトコルを定義することによって実装されます。Delegateを利用して特定のアクションに応答したり、外部ソースの基になる型を知らなくても外部ソースからデータを取得したりできます。
Delegateでで”できる事”
・処理の一部を別のクラスまたは構造体で行うことができる。
・外部ソースからデータを取得することができる。
例えば画面に表示しているPlayボタンのタップ操作を別の制御クラスで実処理したい場合などにDelegateを使用することで表示モジュールと制御モジュールに処理を分けた実装が可能になります。
MVC(Model View Controller)や、MVP(Model View Presenter)アーキテクチャにおいてViewからの通知などに使用します。
実装方法
・Delegateメソッドを定義
Delegateメソッドをプロトコルとして定義
・Delegateメソッドをコールする処理作成
Delegateメッソドをコールしたい処理に呼び出しを追加します。
・Delegateメソッドの実装
プロトコル定義されたDelegateメソッド
Exsample!
次にDelegateの使用例について書いていきます
表示クラス側
①Delegateメソッドをプロトコルとして定義します。
②Delegateメソッドの実行処理を作成追加。
// ① デリゲートメソッドを定義
protocol mediaControlDelegate: AnyObject{
func play() // PlayBUttonタップ時コールされる
func stop() // StopButtonタップ時コールされる
func pouse() // pouseボタンタップ時コールされるデリゲートメソッド
}
class MediaControlPanele: UIView {
public weak var delegate: mediaControleDelegate?
/// PlayButtonタップ
@IBAction func OnPlayButton(_ sender: Any) {
// ②Delegateメソッドを実行する
if let dele = delegate {
delegate?.play()
}
}
}
※Delegateは強参照のループを防ぐため弱参照(weak)で宣言します。
制御クラス側
③プロトコル定義されたDelegeteメソッドを実装します。
④使用したいデリゲートメソッドを実装しているクラスにdelegateを登録
class MediaController:{
private var mediaPanel: MediaControlePanele?
private func showMediaControlePanel(){
if mediaPanel == nil {
// ④
mediaPanel = MediaControlePanel()
mediaPanel.delegate = self
}
}
}
/// ③Delegateメソッドを実装
/// ※extensionとして記述する事によりMediaControleDelegateのAPIが明確に区別できる
extension MediaController: MediaControleDelegate{
public func play(){
print("Playボタンが押されたよ!!")
}
public func stop(){
print("Stopボタンが押されたよ!!")
}
public func pouse(){
print("Pouseボタンが押されたよ!!")
}
}
プロトコルに準拠させる場合、おすすめはExtensionで記述することです。Extensionで記述することで他のクラスメソッドと区別しやすくなります。
「Protocol」については以下の記事で記載していますのでよかったら参照してみてください。
最後までお読みいただきありがとうございます。
「Extension」については以下の記事で記載していますのでよかったら参照してみてださい。