初心者ですがSwift3でスマートバナービューを実装しました

プログラムの勉強を始めると真っ先に思い浮かぶことがアプリに広告を付けたいという事です。
ただ、初心者なのでどういう風に実装すればいいのかをよく分からないです。
Smartバナービューを実装する時に色々四苦八苦してコードが変わっていったので順を追ってメモを残します。

1、とりあえず動かす
2、別関数にする
3、バナーは他でも使うのでプロトコルとして実装し、ファイルを分割する

という感じ変わっていきました。

この記事の趣旨はバナービューはアプリの色々なベージで使うので、プロトコルとして実装した方がいいという事ですが、初心者なりにコードを変えていった過程を載せると分かりやすいと思い変遷をメモりました。

## 1、とりあえず動かす

サンプルコードを参考にして、そのまま実装しました。
サンプルそのままです。

``` ViewController.swift
import UIKit
import GoogleMobileAds

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
/*
　　広告の実装
*/
        let TEST_ID = "ca-app-pub-3940256099942544/2934735716"
        
        var smartBannerView:GADBannerView = GADBannerView()
        smartBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        
        let bHeight :CGFloat = 90 //高さは公式の資料より　50でもOK　幅はスマートバナービューなので横幅と等しい
        smartBannerView.frame = CGRect(x: 0 , y: self.view.frame.size.height-bHeight, width: self.view.frame.width, height: bHeight)
        
        smartBannerView.adUnitID = TEST_ID
        smartBannerView.rootViewController = self
        
        let request = GADRequest()
        request.testDevices = [kGADSimulatorID]
        smartBannerView.load(GADRequest())

        self.view.addSubview(smartBannerView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        
    }
}

```

CocoaPodsの導入方法は色々なページがあるので省略します。
テストIDを使ってます。Googleへ正式な申請した場合はテストIDを書き換えてください。
とりあえず動かせばいいのでこれで良しとします。

## 2、別関数にする
このままだとviewDidLoad()が分かりにくくなるので別関数にしました。
このあたりは当然の流れだと思います。

``` ViewController.swift
import UIKit
import GoogleMobileAds

class ViewController: UIViewController {

 
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //広告を表示
        self.view.addSubview(getAdView())
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    /*
     広告を表示
     */
    func getAdView()->GADBannerView{

        let TEST_ID = "ca-app-pub-3940256099942544/2934735716"
        
        var smartBannerView:GADBannerView = GADBannerView()
        smartBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        
        let bHeight :CGFloat = 90 //高さは公式の資料より　50でもOK　幅はスマートバナービューなので横幅と等しい
        smartBannerView.frame = CGRect(x: 0 , y: self.view.frame.size.height-bHeight, width: self.view.frame.width, height: bHeight)
        
        smartBannerView.adUnitID = TEST_ID
        smartBannerView.rootViewController = self
        
        let request = GADRequest()
        request.testDevices = [kGADSimulatorID]
        smartBannerView.load(GADRequest())
        
        return smartBannerView
    }
}

```


##3、バナーは他でも使うのでプロトコルとして実装し、ファイルを分割する
関数化した後に考える事としては、この関数を共通関数として使いまわしたいという事です。
その為の仕組みとしてはprotocol extensionを使うとコードの再利用、共通化が楽という事です。
まずはViewController.swiftをプロトコルとして書き換えます。


``` ViewController.swift

import UIKit
import GoogleMobileAds

protocol AdShowable {
    
}

extension AdShowable where Self: UIViewController {  
    /*
     広告を表示
     */
    func getAdView()->GADBannerView{
        
        let TEST_ID = "ca-app-pub-3940256099942544/2934735716"
        
        var smartBannerView:GADBannerView = GADBannerView()
        smartBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        
        let bHeight :CGFloat = 90 //高さは公式の資料より　50でもOK　幅はスマートバナービューなので横幅と等しい
        smartBannerView.frame = CGRect(x: 0 , y: self.view.frame.size.height-bHeight, width: self.view.frame.width, height: bHeight)
        
        smartBannerView.adUnitID = TEST_ID
        smartBannerView.rootViewController = self
        
        let request = GADRequest()
        request.testDevices = [kGADSimulatorID]
        smartBannerView.load(GADRequest())
        
        return smartBannerView
    }
}


class ViewController: UIViewController ,AdShowable{

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //広告を表示
        self.view.addSubview(getAdView())
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}


```

こんな感じになりました。
広告を表示したいビューでAdShowableのプロトコルを追加してgetAdView()を実行すればどこでも使えます。
わざわざこういう書き方にしたのは理由があります。
ファイルを分割しやすいという事です。

メインのルーチンから広告処理関連の関数を追い出せたので、その部分を別ファイルにします。
新規にSwiftコードを作成します。
名前は「AdShowable+UIViewController.swift」とします。

コードはプロトコル部分を取り出し、以下のようになります。

``` AdShowable+UIViewController.swift
import GoogleMobileAds

protocol AdShowable {
    
}

/*
 広告を表示
 */
extension AdShowable where Self: UIViewController {
    
    func getAdView()->GADBannerView{
        
        let TEST_ID = "ca-app-pub-3940256099942544/2934735716"
        
        var smartBannerView:GADBannerView = GADBannerView()
        smartBannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        
        let bHeight :CGFloat = 90 //高さは公式の資料より　50でもOK　幅はスマートバナービューなので横幅と等しい
        smartBannerView.frame = CGRect(x: 0 , y: self.view.frame.size.height-bHeight, width: self.view.frame.width, height: bHeight)
        
        smartBannerView.adUnitID = TEST_ID
        smartBannerView.rootViewController = self
        
        let request = GADRequest()
        request.testDevices = [kGADSimulatorID]
        smartBannerView.load(GADRequest())
        
        return smartBannerView
    }
}

```

そして、メインルーチンのViewController.swiftは以下のようになります。

``` ViewController.swift
import UIKit

class ViewController: UIViewController ,AdShowable{

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //広告を表示
        self.view.addSubview(getAdView())
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

```


どうでしょうか？
メインルーチンのViewController.swiftがすっきりしたと思います。

共通クラスファイルを作って実装するという手段もありましたが、プロトコルのエクステンションを選択した理由は、後々のメンテナンスが楽になるだろうという理由です。

知っていれば大したネタでは無いのですが、初心者の自分に対する勉強メモとして書き残してみました。