我有一个已创建的协议(在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'
为什么会发生这种情况,我该怎么做才能使其如上所述工作?
附录
答案 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