delegate(デリゲート)のsample NO3 swift

デリゲート。それを聞くとついビクビクしてしまう私。それは私がまだまだデリゲートと仲良しじゃないから。
だから私はデリゲートと仲良くなるためにデリゲートのことをもっと知ろう。それを記録に残しておこうと思ってここに書かさせていただきます。No3:dragon:

今度は本来xcodeにあるデリゲートメソッドを自作するというものです。
今回は書くことがたくさんあってコメントだらけになってしまったのでみにくくなってたらごめんんさい。:crying_cat_face:

今回参考にさせていただいたURLです。→
http://nukenuke.hatenablog.com/entry/2015/09/17/120749


デリゲートを自作するためには、プラスして何をするか？

デリゲートメソッドにするものを作成したプロトコルに宣言する。

```
@objc protocol SampleViewDelegate {
    
   
     @objc optional func didChangeBackgroundColor(str:String)
}

```
デリゲートメソッドを使うためにデリゲートの宣言しとく。

```weak var delegate: SampleViewDelegate?
```
使いたいところでデリゲートメソッドを呼ぶ

```
self.delegate?.didChangeBackgroundColor!(str:"押されました!")
```

全体的なcode↓

```ViewController.swift
//わたし

import UIKit

//わたしはあなたと一緒じゃないとできないの。
//作成したデリゲートを宣言します。
class ViewController: UIViewController,SampleViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //このクラスでのviewにsampleクラスで作ったviewを入れます。
        let view = Sample(frame:CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0));
       
        //このviewの色々な設定はここ(self)で行います。
        //あなたの子はあなたの色々んものを引き継ぐわ
        view.delegate = self
        
        //作成したviewをこのクラスが持っているviewに入れます(表示)
        self.view.addSubview(view)
        
    }

    
    /*このdidChangeBackgroundColorのメソッドの実行されるタイミングはボタンが押された時です*/
    
    //デリゲートメソッドのカスタマイズ
    //あなたをカスタマイズします
    func didChangeBackgroundColor(str:String) {
        
        //didChangeBackgroundColorが実行されるタイミングでstrで渡されている引数を使い簡単なログを表示します。
        print(str);  //押されました!
        
        //didChangeBackgroundColorが実行されるタイミングで自分のviewのバックにあるself.viewの色を青にします。
        self.view.backgroundColor = UIColor.blue
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```


```DelegateSample.swift
//あなたは本来xcodeにいるけど。いないあなたを作る　= 自作Delegate

import Foundation
import UIKit

//あなた
// SampleViewDelegate プロトコルを記述　デリゲートとして扱うものはこういう書き方をする。
@objc protocol SampleViewDelegate {
    
    // デリゲートメソッド定義
    //optionalをつけることで必ずしも宣言しないといけないデリゲートにはならない。
    //optionalの部分がrequiredだと必ず実装しないといけないデリゲートになる。
    //@objc optionalがない状態だとrequiredとして扱われるらしいです。
     @objc optional func didChangeBackgroundColor(str:String)
}

class Sample : UIView{
    
    //SampleViewDelegateのインスタンスを宣言
    //このクラスでデリゲートを使用するので宣言しとく。
    weak var delegate: SampleViewDelegate?
    
    override func draw(_ rect: CGRect) {
        
        //ボタンを作成
        let button = UIButton()
        button.setTitle("Tap", for: .normal)
        button.frame = (frame:CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0));
        button.backgroundColor = UIColor.red

        //ボタンが押された時に実行するメソッド作成
        button.addTarget(self, action: #selector(tappedButton(sender:)), for: .touchUpInside)
        
        self.addSubview(button)
    }
    
    
    //ボタンが押された時にデリゲートメソッドであるdidChangeBackgroundColorを実行する。
    //あなたが呼ばれるタイミング
    @IBAction func tappedButton(sender: AnyObject) {
        
        // デリゲートメソッドを呼ぶ(処理をデリゲートインスタンスに委譲する)
        //デリゲートにすることで色々なところでカスタマイズできるようになる。
        self.delegate?.didChangeBackgroundColor!(str:"押されました!")
    }
}

```

シュミレータで表示するとこんな感じです。
ボタンが押される前
<img width="414" alt="Simulator Screen Shot 2017.03.25 19.50.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/92a3db9d-7a0d-49fe-b1d0-4fd904a188b0.png">

ボタンが押された後
<img width="414" alt="Simulator Screen Shot 2017.03.25 19.50.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/9a12f120-fc43-526e-3545-35b8c8d33755.png">

ちなみにもちろん押されたたんびログの"押されました！"は出されます。



もっともっと勉強して、今度は参考なしでデリゲートを書いて見たいです。頑張れ！わたし！:fire: