我们可以在 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
中,service
是 ServiceProtocol
,我有错误:
无法分配给 属性:'service' 是一个 'let' 常数
这对我来说是胡说八道,因为我并没有试图将任何东西分配给 service
:我只是想分配 service
的 属性。 enabled
是 get set
,我应该可以分配它,就像 A
.
如果我在 class B
中将 service
声明为 var
,则错误消失。
有什么想法吗?
这是因为类,结构和枚举可以实现你的协议,所以编译器不知道它是引用类型还是值类型。您可以将您的协议限制为仅适用于 类,并且您的代码将有效
protocol ServiceProtocol: AnyObject {
var enabled: Bool { get set }
}
现在
b.service.enabled = false
编译正常
我有这样的代码(在操场上玩:
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
是 ServiceProtocol
,我有错误:
无法分配给 属性:'service' 是一个 'let' 常数
这对我来说是胡说八道,因为我并没有试图将任何东西分配给 service
:我只是想分配 service
的 属性。 enabled
是 get set
,我应该可以分配它,就像 A
.
如果我在 class B
中将 service
声明为 var
,则错误消失。
有什么想法吗?
这是因为类,结构和枚举可以实现你的协议,所以编译器不知道它是引用类型还是值类型。您可以将您的协议限制为仅适用于 类,并且您的代码将有效
protocol ServiceProtocol: AnyObject {
var enabled: Bool { get set }
}
现在
b.service.enabled = false
编译正常