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