我试图使复杂的类层次结构符合协议,这有助于我重用代码片段。为此,我面临以下问题:类A具有属性b,这是类B的实例。B确实符合ProtocolB
。现在,我想定义一个协议ProtocolA
,以便A确实符合ProtocolA
,并且ProtocolA
指定类型ProtocolB
的b。
这是我想出的:
class A {
var b: B?
}
class B {}
protocol ProtocolA {
var b: ProtocolB? { get }
}
protocol ProtocolB {}
extension B: ProtocolB {}
extension A: ProtocolA {}
不幸的是,XCode显示错误:
类型'A'不符合协议'ProtocolA'。
值得一提的是,我不能像这样直接定义类A和B:
class A: ProtocolA {
var b: ProtocolB?
}
class B: ProtocolB {}
因为类A和B是由库预定义的。
答案 0 :(得分:1)
您可以使用关联的类型。
在ProtocolA
中声明一个关联的类型:
protocol ProtocolA {
associatedtype BType: ProtocolB
var b: BType? { get } // Note the change in the type of b
}
这是说b
是符合ProtocolB
的某种可选类型。究竟是什么类型?这取决于ProtocolA
的符合者。
在A
的扩展名中,指定BType
是什么:
extension A: ProtocolA {
typealias BType = B
}
您完成了!
结果,您将无法使用ProtocolA
作为变量的类型:
var protocolA: ProtocolA? // error
因为您不知道b
的类型。
答案 1 :(得分:0)
您可以使用associatedtype
:
class A {
var b: B?
}
class B {}
protocol ProtocolA {
associatedtype PB: ProtocolB
var b: PB? { get }
}
protocol ProtocolB {}
extension B: ProtocolB {}
extension A: ProtocolA {}