(如果有人可以建议更好的标题,请这样做)
以下代码无法编译并出现错误 Type 'ObserverClass' does not conform to protocol 'Observer'
,编译器建议通过声明 var object: ObservedObject
进行修复.
class ObservedObject {}
class ObservedObjectSubclass: ObservedObject {}
protocol Observer {
var object: ObservedObject { get }
}
class ObserverClass: Observer { // Type 'ObserverClass' does not conform to protocol 'Observer'
// suggested:
// var object: ObservedObject
var object: ObservedObjectSubclass = ObservedObjectSubclass()
}
我的看法 - ObservedObjectSubclass
是 ObservedObject
,等等object
属性保证为 ObservedObject
类型按照协议(protocol)的要求。
(如果使用协议(protocol)一致性而不是子类化,情况也是如此 - 如下)
protocol ObservedObjectProtocol {}
protocol Observer {
var object: ObservedObjectProtocol { get }
}
class ObservedObject: ObservedObjectProtocol {}
class ObserverClass: Observer { // same error
var object: ObservedObject = ObservedObject()
}
为什么编译器不高兴?是当前的限制,还是编译器实际上是正确的并且存在一些逻辑约束?
最佳答案
当您在协议(protocol)中定义变量并为其分配类型时,这将是一个具体类型,因此在符合协议(protocol)时您无法将其更改为该类型的子类。一致性类中声明的变量类型必须与协议(protocol)中声明的类型相同,不能是协变(继承相关)类型。
您可以通过为您的 Observer
协议(protocol)创建一个 linkedType
来修复第二个错误,该协议(protocol)继承自 ObserverObject
然后您可以定义 object
与您的关联类型具有相同的类型。然后,您可以使您的 ObserverClass
具有 ObservedObjectSubclass
类型的属性 object
。
class ObservedObject {}
class ObservedObjectSubclass: ObservedObject {}
protocol Observer {
associatedtype ObjectSubclass: ObservedObject
var object:ObjectSubclass { get }
}
class ObserverClass: Observer {
var object = ObservedObjectSubclass()
}
关于子类型的 Swift 协议(protocol)一致性要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918812/