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