协议中的 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&lt;ProtocolA&gt; 我忘了说的是虽然协议是公共的,但类是私有的(现已编辑),我不想公开内部类。 无法修改ProtocolA怎么办?

以上是关于协议中的 Swift 协议属性 - 候选人的类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章

swift 1.2 版中的 iCarousel 错误(候选不是 Objc 但协议需要它)

Swift中的协议

Swift中协议的简单介绍

swift3.0 扩展协议

swift-如何确保最初在哪个协议或类型中定义了特定属性?

类型“myViewController”不符合 Swift 中的 UIPIckerDataSource 协议