【问题标题】:Swift protocol property in protocol - Candidate has non-matching type协议中的 Swift 协议属性 - 候选人的类型不匹配
【发布时间】: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 }
}

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

【问题讨论】:

    标签: swift swift2 swift-protocols


    【解决方案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怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2023-04-06
    相关资源
    最近更新 更多