我们可以在 Swift 中编辑 "let" 协议属性的属性吗?

Can we edit properties of "let" protocol properties in Swift?

我有这样的代码(在操场上玩:

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 中,serviceServiceProtocol,我有错误:

无法分配给 属性:'service' 是一个 'let' 常数

这对我来说是胡说八道,因为我并没有试图将任何东西分配给 service:我只是想分配 service 的 属性。 enabledget set,我应该可以分配它,就像 A.

如果我在 class B 中将 service 声明为 var,则错误消失。

有什么想法吗?

这是因为类,结构和枚举可以实现你的协议,所以编译器不知道它是引用类型还是值类型。您可以将您的协议限制为仅适用于 类,并且您的代码将有效

protocol ServiceProtocol: AnyObject {
    var enabled: Bool { get set }
}

现在

b.service.enabled = false

编译正常