4

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

协议需要类型为“ProtocolB”的属性“prop”?

候选人有非匹配类型“B 类?”

这很烦人,因为 ClassB 符合 ProtocolB。

在过去,我可能只是将属性声明为:

@property (nonatomic) ClassB <ProtocolB> *prop;

但似乎我可以快速解决这个问题的唯一方法是添加一个 ivar,例如:

private class ClassA : ProtocolA {        
    var _prop: ClassB?
    var prop: ProtocolB? { return _prop }
}

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

4

1 回答 1

3

您需要声明typealias符合其他协议的类型。你这样做的方式是prop必须完全是 type ProtocolB,但你实际上并不想要那个,你想要一个符合它的类型。

protocol ProtocolA {
    typealias Prop : ProtocolB
    var prop: Prop? { get }
}

protocol ProtocolB {}


class ClassA : ProtocolA {
    var prop: ClassB?
}

class ClassB : ProtocolB {}
于 2015-10-26T22:20:18.000 回答