2016-06-16 6 views
1

私は、プロトコルと委任パターンがSwiftでどのように機能するかを質問したいと思います。Swift:プロトコルと委任パターンについて

iOSプラットフォームでgoogle ad sdkを試用できるアプリケーションがあります。しかし、私は何かが足りなくて、方法の仕方について混乱しています。

私はこれらのコードをいくつか持っています。上記のコードについて

import UIKit 
import GoogleMobileAds 

class ViewController: UIViewController, GADInterstitialDelegate { 

@IBOutlet weak var bannerView: GADBannerView! 
let request = GADRequest() 
var interstitial: GADInterstitial! 

@IBOutlet weak var mylbl: UILabel! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    bannerView.adUnitID = "xxx" 
    bannerView.rootViewController = self 
    bannerView.loadRequest(self.request) 
    interstitial = createAndLoadInterstitial() 
} 

func createAndLoadInterstitial() -> GADInterstitial { 
    let interstitial = GADInterstitial(adUnitID: "xxx") 
    interstitial.delegate = self 
    interstitial.loadRequest(self.request) 
    return interstitial 
} 

func interstitialDidDismissScreen(ad: GADInterstitial!) { 
    interstitial = createAndLoadInterstitial() 
    mylbl.text = "No ad" 

} 

func interstitialDidReceiveAd(ad: GADInterstitial!) { 
    mylbl.text = "received ad" 
} 

@IBAction func touched(sender: AnyObject) { 

    if interstitial.isReady 
    { 
     interstitial.presentFromRootViewController(self) 
    } 
    else 
    { 
     mylbl.text = "Not Ready!" 
    } 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

、私はメソッドとプロパティのプロトコルの設計図は、クラスまたは構造体、または列挙型を採用することを認識です。プロトコルで定義されているメソッドまたはプロパティは、関連デリゲートが採用したクラスで実装する必要があります。

私はそれとcofusedポイントを要求したい: "interstitialDidDismissScreen"という名前のメソッドは、デリゲート "GADInsterstitialDelegate"から継承されていますが、インタースティシャル広告の閉じるボタンを押してメソッドを処理する方法。 Googleのエンジニアがどのように実装し、どのようにこの動作を成功させるかご協力いただきありがとうございます。

いいえハック、

答えて

1

ボタンの処理は、GADInterstitialクラス内で行われています。クラスをセットアップするときには、おそらくすべての広告のやり取りを処理する内部メソッドがあります。そして、デリゲートメソッドを使用して、UI管理のために知っておく必要のある情報をクラスに返します。デリゲートとそのメソッドを実装することによって、あなたのクラスが何かを使用したいと言いました。そして、そのクラスからのすべてのフィードバックも処理したいと思います。独自のクラスを作成してプロトコルと代理を実装する場合は、クラス内で必要なものをすべて実行してから、クラスのデリゲートに情報を渡します。例として、バーコードリーディングクラスがあります。私はバーコードがどのように読み込まれても気にしない、私はちょうどコードを知りたいので、私は私の呼び出しクラスをバーコードリーディングクラスの代理人に設定することができ、バーコードが読み取られると、バーコードデリゲートメソッド。

+0

OMG!この答えは、より輝かしく、開いており、過小評価されています。あなたのバーコードの例は素晴らしいです。貴重な答えをありがとう!私は完全に私が行方不明と何がポイントであることを理解!私はこのアイデアが私たちのオブジェクトやクラスの抽象を別のものから守っていると思います。抽象化のための良いパターンも私は思います。正確には、AdMob SDKのコードは正しく閉鎖されていますか?クラスが何をしているのかわからない。それは単にエンドポイントを与え、出力を使用します。完璧。そんなにありがとうございました。 –

1

あなたの質問の文法は、わかりにくいです。

プロトコルは基本的に契約です。プロトコルに準拠するオブジェクトは、プロパティを提供し、プロトコルが定義するメソッドに応答することを約束します。あなたは

someObject.delegate = self 

を言うとき

あなたは他のオブジェクトに自分自身へのポインタを渡しています。これは、誰かにあなたの電話番号を与えて、「これらの用事を私のために実行してください。質問がある場合は、この番号で私に電話してください。

他のオブジェクトは、それのデリゲートは、特定のプロトコルに準拠していることを知っているので、それは(それがデリゲートに送信することができますどのようなメッセージ)、それは携帯電話を介して送信することができますどのようなメッセージを知っている

私は方法interstitialDidReceiveAd(ad: GADInterstitial!)interstitialDidDismissScreen(ad: GADInterstitial!)を疑っていますデリゲートメソッド。

interstitialオブジェクトがデリゲートにメッセージを送信する必要がある場合、これらのメソッドが呼び出されます。

+0

答えをありがとう。あなたは正しいです。私はあなたの答えに満足しています。インタースティシャルオブジェクトをブラウズすると、いくつかのコメント行がそのアイデアを確認します。 "///インタースティシャルを表示する準備ができている場合はYESを返します。このプロパティがNOからYESに切り替わった後に、デリゲートの /// interstitialAdDidReceiveAd:が呼び出されます。 –

+1

権利。デリゲートデザインパターンは、Cocoa全体で使用され、MacとiOSの両方でObjective-CとSwiftの両方で使用されます。私は10年以上それを使ってきたので、私が言うことは100%確実です。 –

+0

どのような経験:+10年。あなたのコメントありがとう:) –