协议中的 Swift 协议属性 - 候选人的类型不匹配
Posted
技术标签:
【中文标题】协议中的 Swift 协议属性 - 候选人的类型不匹配【英文标题】:Swift protocol property in protocol - Candidate has non-matching type 【发布时间】:2015-10-26 21:10:23 【问题描述】:我有一个协议 (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”?
候选人的类型不匹配'ClassB?'
这很烦人,因为 ClassB 符合 ProtocolB。
在过去,我可能只是将属性声明为:
@property (nonatomic) ClassB <ProtocolB> *prop;
但我似乎可以快速解决这个问题的唯一方法是添加一个 ivar,例如:
private class ClassA : ProtocolA
var _prop: ClassB?
var prop: ProtocolB? return _prop
有没有办法解决这个问题?
【问题讨论】:
【参考方案1】:您需要声明一个符合其他协议类型的typealias
。您这样做的方式是 prop
必须完全属于 ProtocolB
类型,但您实际上并不想要这样,而是想要一个符合它的类型。
protocol ProtocolA
typealias Prop : ProtocolB
var prop: Prop? get
protocol ProtocolB
class ClassA : ProtocolA
var prop: ClassB?
class ClassB : ProtocolB
【讨论】:
好吧,现在我得到“ProtocolA 只能用作通用约束,因为它具有 Self 或关联的类型要求”,当我尝试将它用作:let array = Array<ProtocolA>
我忘了说的是虽然协议是公共的,但类是私有的(现已编辑),我不想公开内部类。
无法修改ProtocolA
怎么办?以上是关于协议中的 Swift 协议属性 - 候选人的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章