ios - Swift 3/如何重用扩展

标签 ios swift

我正在尝试保存代码并重构。

在我的项目中,我在多个 UIViewController 中使用以下 adMobBanner 扩展。

整个扩展是可重用的,我只需要更改 ViewController 的名称:

extension MyVC: GADInterstitialDelegate {

但是由于我在多个类中使用它,因此这些类的长度不必要地超出。

有某种方法可以重用该扩展吗?像这样的东西:

func myExtension(vc: UIViewController) {
    extension vc: GADInterstitialDelegate {
    ....
    }
}

myExtension(MyViewController)调用

我知道这段代码是无稽之谈,但它提供了我想要转置的想法。有这样的事吗?或者,保存重复代码的扩展代码行的另一种选择是什么?非常感谢您的帮助。

我的扩展:

extension MyViewController: GADInterstitialDelegate {

    // MARK: - Setup Ads
    func setupAds() {
        // Setup our interstitial ad initially
        interstitial.delegate = self
        interstitial.load(GADRequest())


    }

    // MARK: - Load Interstitial Ad
    func loadFullScreenAd() {
        // GADInterstitial's are single use. You have to create a new GADInterstitial for each presentation
        // So, if you'd like to show more than one GADInterstitial in your apps session we need this
        // This func will be used to create a new GADInterstitial after one has been displayed and dismissed
        interstitial = GADInterstitial(adUnitID: getAdmobInterstitial())


        interstitial.delegate = self
        interstitial.load(GADRequest())

    }


    // MARK: - Show Interstitial Ad
    func showFullScreenAd() {
        // Call this function when you want to present the interstitial ad
        // ie. game over, transition to another vc, etc...
        // Make sure you give atleast a few seconds for this ad to load before atempting to present it
        // For example, don't try to present this ad in viewDidAppear

        // Check if the interstitial ad is loaded before trying to present it

        if self.interstitial.isReady {

            self.interstitial.present(fromRootViewController: self)
        }
    }


    // MARK: - GADInterstitial Delegate Methods
    func interstitialDidReceiveAd(_ ad: GADInterstitial!) {
        print("interstitialDidReceiveAd")
        showFullScreenAd()
    }

    func interstitialWillPresentScreen(_ ad: GADInterstitial!) {
        print("interstitialWillPresentScreen")
        // If you needed to pause anything in your app this would be the place to do it
        // ie. sounds, game state, etc...
    }

    func interstitialDidDismissScreen(_ ad: GADInterstitial!) {
        print("interstitialDidDismissScreen")
        // The GADInterstitial has been shown and dismissed by the user
        // Lets load another one for the next time we want to show a GADInterstitial

        //loadFullScreenAd()

        // If you paused anything in the interstitialWillPresentScreen delegate method this is where you would resume it
    }

    func interstitial(_ ad: GADInterstitial!, didFailToReceiveAdWithError error: GADRequestError!) {
        print("interstitial didFailToReceiveAdWithError: \(error)")
    }
}

最佳答案

到目前为止对我有用的是创建一个自己的文件,名为“关于类扩展内容的名称,然后我将该文件放入名为Extensions的组文件夹中。所以在你的情况下,我会这样调用该文件:

GADInterstitialDelegate-UIViewControllerExtension.swift

里面的代码是这样的:

extension UIViewController: GADInterstitialDelegate {
// your reusable code
}

这只是我的方法,我认为还有其他好的方法

关于ios - Swift 3/如何重用扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196433/

相关文章:

ios - 验证错误 : The bundle contains disallowed nested bundles

ios - 包含 UITableView 的 UITableViewCell 的高度(iOS8 和 AutoLayout)

ios - 调用框架中的方法

string - 如何快速删除字符串中的减号

swift - 在 uitableviewcell swift 中按下返回键

ios - 如何在 Swift 的 uiviewcontroller 背景中显示自动滚动的图像?

ios - 如何从 json 响应创建动态节头

ios - 深层链接 URL 方案不会调用 iOS App Delegate 中的任何函数

ios - Objective-C - 从字符串中删除最后一个字符

ios - 限制解析查询