如何在Swift中使用具有相同协议变量的多个协议?

NJG*_*GUY 5 protocols ios swift

我正在迅速实现两个协议, GADCustomEventInterstitialGADCustomEventBanner

这两个协议都需要一个名为的属性delegatedelegate每种协议中的术语是不同的类型,因此会产生冲突。

 class ChartBoostAdapter : NSObject, GADCustomEventInterstitial, GADCustomEventBanner, ChartboostDelegate{
        var delegate:GADCustomEventInterstitialDelegate?; // Name conflict
        var delegate:GADCustomEventBannerDelegate?; // Name conflict
         override init(){

        }
    ...

    }
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

它们是库/框架,这不是我的定义

那么显然你不能让同一个类采用两种协议。但你真的不需要。只需将此功能分为两个不同的类,这显然是这些协议设计者的意图。你应该有一类是采用GADCustomEventInterstitial并具有 delegate另一个是采用类GADCustomEventBanner和具有它的 delegate。你有什么理由试图强迫它们成为同一个类?就像在使用框架的所有事情中一样,不要与框架作斗争,要服从它。


Mat*_*mar 5

其实也有可能,我刚刚也遇到过同样的情况。我有两个不同但相关的协议。在某些情况下,我需要通过委托来实现这两个属性,而在其他情况下,只需要一个属性,并且我不想有两个属性,例如... delegate1、delegate2。

您需要做的是创建另一个继承这两个协议的组合协议:

protocol ChartBoostAdapterDelegate: GADCustomEventInterstitialDelegate, GADCustomEventBannerDelegate { }


class ChartBoostAdapter : NSObject, GADCustomEventInterstitial, GADCustomEventBanner, ChartboostDelegate {

    weak var delegate: ChartBoostAdapterDelegate?

    override init(){

    }
    ...

}
Run Code Online (Sandbox Code Playgroud)


Vat*_*not 4

简单的答案是你不能。

也许一个协议依赖于另一个协议,在这种情况下,您将使用委托类型的依赖协议。