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

Car*_*kis 0 let swift swift-protocols

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

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
Run Code Online (Sandbox Code Playgroud)

如果我引用serviceService(class A),则一切都按预期进行。在 class 中Bservice作为 a ServiceProtocol,我有错误:

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

这对我来说是无稽之谈,因为我不想分配任何东西给service:我只是想分配service. enabledget set,我应该能够分配它,就像在A.

如果我声明service为 a varin class B,错误就会消失。

有任何想法吗?

Joa*_*son 5

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

protocol ServiceProtocol: AnyObject {
    var enabled: Bool { get set }
}
Run Code Online (Sandbox Code Playgroud)

现在

b.service.enabled = false
Run Code Online (Sandbox Code Playgroud)

编译正常