2016-06-16 146 views
1

我想問一下在Swift中協議和委託模式是如何工作的。Swift:關於協議和委託模式

我有一個應用程序,讓我試試在iOS平臺上的谷歌廣告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 point:OK從代理「GADInsterstitialDelegate」繼承的名爲「interstitialDidDismissScreen」的方法,但是如何通過按插頁式廣告的關閉按鈕處理該方法。谷歌的工程師們在哪裏實施,他們如何成功實現這一行爲。謝謝你的幫助。

良好的黑客,

回答

1

按鈕處理髮生在GADInterstitial類中。當他們設置課程時,他們可能有一些內部方法可以處理所有的廣告交互,然後使用委託方法,他們會將您需要知道的信息發回給班級,以保持您的用戶界面的管理。通過實現委託及其方法,你說我想使用你的類所做的事情,然後我也想處理來自該類的所有反饋。如果你要創建自己的班級並實施一個協議和委託,你可以在班級內做任何你想做的事情,然後只傳遞一小段信息給班級的委託人。一個例子是一個條形碼閱讀課程。我不在乎條形碼是如何讀取的,我只是想知道代碼,所以我可以將我的調用類設置爲條形碼閱讀類的代表,並且當條形碼被讀取時,我會收到條形碼一個條形碼委託方法。

+0

OMG!這個答案更加明智,開放和可信。你的條形碼例子非常好。感謝您寶貴的答覆!我完全理解,我錯過了什麼,什麼是重點!我認爲這個想法保持了我們的對象或類別抽象。我認爲抽象的好模式。那麼確切的說,AdMob SDK的代碼是封閉的嗎?我們看不到班上有什麼。它只是給我們一個端點並使用輸出。完善。非常感謝你。 –

1

你的問題的措辭是亂碼,很難弄清楚。

協議基本上是一個合同。它表示符合協議的objets承諾提供屬性,並對協議定義的方法作出響應。

當你說

someObject.delegate = self 

你是一個指針傳遞給自己的其他對象。這就像給別人打你的電話號碼,並說「請爲我跑這些差事,如果你有任何問題,請給我打這個電話號碼,也可以在差事完成時給我打電話。」

由於其他對象知道它的委託符合特定的協議,它知道什麼樣的信息可以通過手機發送(什麼樣的信息可以發送給代表)

我懷疑方法interstitialDidReceiveAd(ad: GADInterstitial!)interstitialDidDismissScreen(ad: GADInterstitial!)是委託方法。

interstitial對象需要發送消息給它的委託時,它調用這些方法。

+0

感謝您的回答。你是對的,我對你的答案感到滿意。當我瀏覽Interstitial對象時,一些註釋行確認了這個想法; 「///如果插頁式廣告已準備好顯示,則返回YES。此屬性從NO切換爲YES後,將調用代理的 /// interstitialAdDidReceiveAd:」。 –

+1

沒錯。委託設計模式在Cocoa中使用,在Mac和iOS上都用於Objective-C和Swift。我一直在使用它10多年,所以我100%肯定我說的是真實的。 –

+0

哇什麼體驗:+10年。感謝您的評論:) –