尝试使用此处是我的设置:
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()
}
答案 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