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

时间:2015-10-26 21:10:23

标签: swift swift2 swift-protocols

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

没有办法解决这个问题吗?

1 个答案:

答案 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 {}