需要通过使用要求的特定子类(或符合它的类型)来满足 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?
}
我有一个我创建的协议(在 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?
}