我有一个协议(ProtocolA),包含符合第二个协议(ProtocolB)的单个属性。
public protocol ProtocolA {
var prop: ProtocolB? { get }
}
public protocol ProtocolB {
}
我正在尝试声明两个将实现这些的类:
private class ClassA : ProtocolA {
var prop: ClassB?
}
private class ClassB : ProtocolB {
}
但是我收到了一个错误:
类型'ClassA'不符合协议'ProtocolA'
协议要求属性'prop'的类型为'ProtocolB?'
候选人有不匹配类型'ClassB?'
这很烦人,因为ClassB符合ProtocolB。
在古老的时候,我可能只是将财产声明为:
@property (nonatomic) ClassB <ProtocolB> *prop;
但似乎我能在swift中解决这个问题的唯一方法就是添加一个象:
private class ClassA : ProtocolA {
var _prop: ClassB?
var prop: ProtocolB? { return _prop }
}
没有办法解决这个问题吗?
答案 0 :(得分:2)
您需要声明符合其他协议类型的typealias
。你这样做的方式是prop
必须完全属于ProtocolB
类型,但你实际上并不想要它,你需要一种符合它的类型。
protocol ProtocolA {
typealias Prop : ProtocolB
var prop: Prop? { get }
}
protocol ProtocolB {}
class ClassA : ProtocolA {
var prop: ClassB?
}
class ClassB : ProtocolB {}