1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】初めてDelegateを実装する方向けの、サンプルと解説

Posted at

#この記事の対象者
・まずはDelegateの必要最低限のコードを知りたい。という方。
・一通り関連記事を読んだが
 → Delegate実装に「必要/不必要なコード」の区別がつかず難して挫折しそうな方
 → 必要なコードは分かったけど「記述場所」が掴めきれず困っている方

主に下の絵の様な(Delegate初実装時の私)状態のかた向けです。

Frame 3 (1).png

#この記事の非対象者
Delegateについて深く理解したい方
Dlegateの利用方法/活用場面(どんな時に使うの?)を知りたい方
エンジニアとして現場で活躍している方(←の方は特に読まないでください)

#実装コード
今回は下記の絵の場面を実装します
Frame 2 (1).png

##処理を任せる側のファイル

NudeMan.swift

protocol NudeManDelegate {
    func buyHuku()
}

class NudeMan { 

    var delegate: NudeManDelegate?
    
    func cold() {
        self.delegate?.buyHuku()
    }
}

##コード解説

####protocol
classfuncと同じ様にprotocolと書かなければいけません。
急に登場したprotocolが難しく感じますね!
【強敵protocolの倒し方】(難しさ緩和方法)
私は、処理を任せる時だけclassがprotocolに名前を変える。
と思う様にして難しさを緩和しました

 
####NudeManDelegate ( protocolの後につく名前 )
class名と同じ様に任意で構いません。
補足
任意ですが、ホニャララDelegateと書かれるのが一般的です。
(Swiftが元から用意しているprotocol名もUITextFieldDelegateなど、○○Delegateと命名しています)

 
####protocolの中身
ここは裸の男(任せる側)の「服買ってきて」にあたる部分です
今までは
func hoge()の後に必ず { 何らかの処理 } を書いていたと思いますが
今回のprotocolの中には書きません
{ 何らかの処理 }は任せる側に書きます。

####------ ↓ここからNudManクラスの中 --------------- 
####var delegate: NudeManDelegate?
一瞬見慣れない事をやっている様に感じますが、
やっている事は
var sumpleClass: SumpleClass?と同じです。

####self.delegate?.buyHuku()
このタイミングで処理を任せたい(服買ってきて!)という所に書きます。
今回はサンプルでFunc cold()で処理を任せましたが
実際は、
ボタンがタップされたタイミング、何かの処理が終わった後、などで使われます。
処理を任せたいタイミングで
self.delegate?.buyHuku()を実行しましょう。

##処理を任される側のファイル

Woman.swift

Class Woman: UIViewController, NudeManDelegate  { 
 
    var nudeMan: NudeMan?

    override func viewDidLoad() {
        super.viewDidLoad()  

         nudeMan = NudeMan()
         nudeMan.delegate = self
     }

       func buyHuku() {
        print("マフラー買ってきます")
     }

}

####class Woman: UIViewController, NudeManDelegate

UItableView を使った事がある人はUITableViewDelegate
で見た事がありますね。同じ様にNudeManDelegateもここに書きます。
(初めての方はここに書く物だと覚えて下さい)

nudeMan = NudeMan()

依頼する側のクラスをインスタンス化します。
(インスタンス化が分からない方は、とりあえず依頼する側のクラス名に()を付けて
変数に代入しましょう)

###nudeMan.delegate = self

NudeManクラスの依頼を「私が受ける!」と宣言しています

ん!?
NudeManクラスdelegateの型はNudeManDelegateなのに
何で代入できるんだ?と気づいたあなた!さすがです

ここがdelegateの難しいポイントです
しかし今回の目的は「実装コードを知る」なので
「delegateを深く理解する」は一旦スルーしましょう

(テンプレと割り切るのも挫折しない1つの方法だと思います。)

 
どうしても気になる人用にちょっとだけ・・・
WomanクラスNudeMandelegate は型違い(無関係)に見えますが
WomanクラスNudeMandelegate を継承してViewControllerを実装しています。
なので代入できる。今回はこの程度で。

 

func buyHuku() { }

この中で依頼された側それぞれで何を買いに行くか決めます。

##あとがき
今回は、delegateで挫折しない為に

  • Class-only Protocol
  • 循環参照
  • plotocol内のメソッドで引数も渡せる事
  • プロパティも実装できる事
    などなどあえて触れていない事がまだ沢山あります
    この記事を足掛りに、さらに理解を深めて、頂ければ幸いです。
    また、出来るだけ専門用語を使わず解説したつもりでしたが、記事内で出てきた用語、説明の仕方で、分かりにくい部分があれば遠慮なくご指摘下さい。
    記事内画像: icons8 https://icons8.com/
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?