gpt4 book ai didi

子类型的 Swift 协议(protocol)一致性要求

转载 作者:行者123 更新时间:2023-11-30 10:44:58 27 4
gpt4 key购买 nike

(如果有人可以建议更好的标题,请这样做)

以下代码无法编译并出现错误 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com