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

时间:2019-03-18 23:12:24

标签: swift protocols swift-protocols

我有一个已创建的协议(在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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

for prez in roster_snapshot:
    if ' '.join((prez['firstName'], prez['lastName'])) == pName:
        print(prez['pinId'])
        break

这将使您以所需的特异性声明Model2:

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

但是不幸的是,这将意味着您无法再声明类型class Model2: A { var a: Model1? } 的变量。要解决此问题,您可以使用通用模型:

A