Swift协议继承和动态对象混淆

时间:2017-06-05 08:13:20

标签: swift swift-protocols

尝试使用此处是我的设置:

protocol CommonFeatureProtocol { }
extension CommonFeatureProtocol { }


 protocol SpecificFeature1Protocol : CommonFeatureProtocol { 
     func specificFeature1Method()
  }


 protocol SpecificFeature2Protocol : CommonFeatureProtocol { 
      func specificFeature2Method()
 }

struct specificFeature1 : SpecificFeature1Protocol { }
struct specificFeature2 : SpecificFeature2Protocol { }

现在在我的另一个类(UtilFeature)中,是否可以使用特征对象和特定的特征方法,如 -

UtilFeature.feature.specificFeature1Method()
UtilFeature.feature.specificFeature2Method()

UtilFeature) -

之类的东西
var feature : CommonFeatureProtocol {
    return specificFeature1() //or specificFeature2()
}

2 个答案:

答案 0 :(得分:2)

您尝试实现的功能似乎不可能,因为该功能属于CommonFeatureProtocol类型且不包含该方法。因此无法使用object(dot)方法进行访问。

<强>可能的:

var feature : SpecificFeature1Protocol {
    return specificFeature1()
}

feature.specificFeature1Method()

或(不首选的做法)

var newFeature : CommonFeatureProtocol {
    return specificFeature1()
}

(newFeature as SpecificFeature1Protocol).specificFeature1Method()

明白你想要做的是,

您需要制作两种协议的组合。

语法var composition: [Protocol1 & Protocol2]

此外,您可以使用typealias使其更具可读性。

所以,在你的情况下:

typealias SpecificFeatureProtocol = SpecificFeature1Protocol & SpecificFeature2Protocol

var feature: SpecificFeatureProtocol? {
    return nil
}

现在,您可以使用以下方法:

feature?.specificFeature1Method()
feature?.specificFeature2Method()

答案 1 :(得分:0)

希望我能正确理解你的问题

是的,有可能,请考虑以下简单示例。

protocol P0 {}
protocol P1 : P0 {}
protocol P2 : P0 {}

class C1 : P1 {}

let p : P0 = C1() //Expects p to be of the type P0