协议中的Swift协议属性 – 候选者具有非匹配类型

我有一个协议(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 {}
点赞