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

时间:2021-01-08 13:59:56

标签: swift swift-protocols 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(类 A),则一切都按预期进行。在类 B 中,serviceServiceProtocol,我有错误:

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

这对我来说是无稽之谈,因为我不想为 service 分配任何东西:我只是想分配 service 的属性。 enabledget set,我应该能够分配它,就像在 A 中一样。

如果我在类 service 中将 var 声明为 B,错误就会消失。

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

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

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

现在

b.service.enabled = false

编译正常

相关问题