无法分配给 属性:'class' 是一个 'let' 常量
Cannot assign to a property: 'class' is a 'let' constant
我正在尝试更新 WatchlistViewModel
中定义为 let subscriber: SubscriberContextProviding
的服务上的 属性,只需像这样直接设置即可:
subscriber.watchlist = watchlist
相关订户定义:
final class Subscriber: SubscriberContextProviding {
var watchlist = [String]()
}
但是我收到一条错误消息:Cannot assign to property: 'subscriber' is a 'let' constant
.订户服务声明为 let
并在客户端 init
中初始化。
这是相关的协议部分 & init
.
protocol SubscriberContextProviding {
var watchlist: [String] { get set }
}
class WatchlistViewModel: NSObject {
let subscriber: SubscriberContextProviding
init(subscriber: SubscriberContextProviding){
self.subscriber = subscriber
super.init()
}
}
但是如果我将协议从上面的更改为
protocol SubscriberContextProviding {
func set(watchlist: [String])
}
我只是将subscriber
中的函数定义为
func set(watchlist: [String]){
self.watchlist = watchlist
}
而不是现在直接使用
这样的函数设置 属性
subscriber.set(watchlist: watchlist)
没问题。 为什么第一种方法不起作用而后一种方法起作用,因为两种方法的结果相同?
将此添加到您的协议中:
protocol SubscriberContextProviding: AnyObject{
var watchlist: [String] { get set }
}
“问题”(虽然这不是问题,但实际上)是您没有将 SubscriberContextProviding
限制为 class 绑定协议(: AnyObject
)。
let subscriber: SubscriberContextProviding
声明您的 subscriber
变量包含任何类型符合 SubscriberContextProviding
的对象的存在。由于该协议不受 class 约束,因此您处理的具体值可能是一个值类型(元组、结构或枚举),仅允许在可变 var
上进行突变变量。这种存在本身就是一种值类型,并且遵守仅允许对 var
变量进行突变的相同规则。
因此,您必须:
声明 SubscriberContextProviding
为 class-bound:
protocol SubscriberContextProviding: AnyObject { ... }
或
保持你的协议不变,但让你的 subscriber
变量可变,以考虑它包含值类型的可能性。
我正在尝试更新 WatchlistViewModel
中定义为 let subscriber: SubscriberContextProviding
的服务上的 属性,只需像这样直接设置即可:
subscriber.watchlist = watchlist
相关订户定义:
final class Subscriber: SubscriberContextProviding {
var watchlist = [String]()
}
但是我收到一条错误消息:Cannot assign to property: 'subscriber' is a 'let' constant
.订户服务声明为 let
并在客户端 init
中初始化。
这是相关的协议部分 & init
.
protocol SubscriberContextProviding {
var watchlist: [String] { get set }
}
class WatchlistViewModel: NSObject {
let subscriber: SubscriberContextProviding
init(subscriber: SubscriberContextProviding){
self.subscriber = subscriber
super.init()
}
}
但是如果我将协议从上面的更改为
protocol SubscriberContextProviding {
func set(watchlist: [String])
}
我只是将subscriber
中的函数定义为
func set(watchlist: [String]){
self.watchlist = watchlist
}
而不是现在直接使用
这样的函数设置 属性subscriber.set(watchlist: watchlist)
没问题。 为什么第一种方法不起作用而后一种方法起作用,因为两种方法的结果相同?
将此添加到您的协议中:
protocol SubscriberContextProviding: AnyObject{
var watchlist: [String] { get set }
}
“问题”(虽然这不是问题,但实际上)是您没有将 SubscriberContextProviding
限制为 class 绑定协议(: AnyObject
)。
let subscriber: SubscriberContextProviding
声明您的 subscriber
变量包含任何类型符合 SubscriberContextProviding
的对象的存在。由于该协议不受 class 约束,因此您处理的具体值可能是一个值类型(元组、结构或枚举),仅允许在可变 var
上进行突变变量。这种存在本身就是一种值类型,并且遵守仅允许对 var
变量进行突变的相同规则。
因此,您必须:
声明
SubscriberContextProviding
为 class-bound:protocol SubscriberContextProviding: AnyObject { ... }
或
保持你的协议不变,但让你的
subscriber
变量可变,以考虑它包含值类型的可能性。