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

Need to satisfy Swift protocol requirement by using a specific subclass of the requirement (or type that conforms to it)

我有一个我创建的协议(在 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,您可能希望它能够满足协议要求,但我却收到错误消息:

Type 'Model2' does not conform to protocol 'A'

为什么会发生这种情况,我该怎么做才能使其按上述方式工作?

附录

我在 Xcode Playground 中对上述场景进行了建模,这是我所看到的错误的屏幕截图。

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

您可以对关联类型执行此操作:

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?
}