需要通过使用需求的特定子类(或符合它的类型)来满足Swift协议要求

问题描述 投票:3回答:2

我有一个我创建的协议(在Swift 4.2中),它的一个要求是一个与协议本身类型相同的属性。

举个例子,我有一个像这样定义的协议:

protocol A {
    var a: A? { get set }
}

我有几个符合此协议的模型:

class Model1: A {
    var a: A?
}
class Model2: A {
    var a: A?
}

对于我的一个模型,我需要通过更具体地对变量a定义的属性(即具有协议类型的变量)来满足协议要求。例如,我可能希望将Model2实现为:

class Model2: A {
    var a: Model1?
}

在这种情况下,因为Model1符合协议A,你会期望这能够满足协议要求,但是我得到一个错误:

类型'Model2'不符合协议'A'

为什么会发生这种情况,我该怎么做才能让它如上所述工作?

附录

我在Xcode Playground中对上面的场景进行了建模,这里是我看到的错误的屏幕截图。 enter image description here

swift protocols swift-protocols
2个回答
5
投票

为了符合协议A,Model2需要一个成员var a,它允许存储对符合协议A的任何内容的引用,而不仅仅是对Model1的引用。所以你不能这样做。


4
投票

您可以使用相关类型执行此操作:

protocol A {
    associatedtype B: A
    var a: B? { get }
}

这将允许您使用您希望的特异性声明Model2:

class Model2: A {
    var a: Model1?
}

但不幸的是,这意味着你不能再声明A类型的变量。要解决这个问题,您可以使用通用模型:

class Model1<T: A>: A {
    var a: T?
}
© www.soinside.com 2019 - 2024. All rights reserved.