我有一个协议(ProtocolA)包含一个符合第二个协议(ProtocolB)的属性.
public protocol ProtocolA {
var prop: ProtocolB? { get }
}
public protocol ProtocolB {
}
我正在尝试声明两个将实现这些的类:
private class ClassA : ProtocolA {
var prop: ClassB?
}
private class ClassB : ProtocolB {
}
但是我收到一个错误:
Type ‘ClassA’ does not conform to protocol ‘ProtocolA’
Protocol requires property ‘prop’ with type ‘ProtocolB?’
Candidate has non-matching type ‘ClassB?’
由于ClassB符合ProtocolB,这很烦人.
在古老的我可能只是声明财产:
@property (nonatomic) ClassB <ProtocolB> *prop;
但似乎我能在swift中解决这个问题的唯一方法就是添加一个像以下一样的ivar:
private class ClassA : ProtocolA {
var _prop: ClassB?
var prop: ProtocolB? { return _prop }
}
有没有办法解决这个问题?
最佳答案 您需要声明符合其他协议的类型的类型.你这样做的方式是prop必须完全属于ProtocolB类型,但你实际上并不想要它,你想要一个符合它的类型.
protocol ProtocolA {
typealias Prop : ProtocolB
var prop: Prop? { get }
}
protocol ProtocolB {}
class ClassA : ProtocolA {
var prop: ClassB?
}
class ClassB : ProtocolB {}