我有一个这样的代码(在操场上玩:
protocol ServiceProtocol {
var enabled: Bool { get set }
}
class Service: ServiceProtocol {
var enabled: Bool = false
}
class A {
let service = Service()
}
class B {
let service: ServiceProtocol = Service()
}
let a = A()
let b = B()
a.service.enabled = false
b.service.enabled = false // <-- the error is here: Cannot assign to property: 'service' is a 'let' constant
如果我将 service
引用为 Service
(类 A
),则一切都按预期进行。在类 B
中,service
是 ServiceProtocol
,我有错误:
无法分配给属性:'service' 是一个 'let' 常量
这对我来说是无稽之谈,因为我不想为 service
分配任何东西:我只是想分配 service
的属性。 enabled
是 get set
,我应该能够分配它,就像在 A
中一样。
如果我在类 service
中将 var
声明为 B
,错误就会消失。
有什么想法吗?
答案 0 :(得分:5)
这是因为类、结构和枚举可以实现您的协议,因此编译器不知道它是引用类型还是值类型。您可以将您的协议限制为仅用于类,您的代码将起作用
protocol ServiceProtocol: AnyObject {
var enabled: Bool { get set }
}
现在
b.service.enabled = false
编译正常