无法分配给 属性:'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 变量进行突变的相同规则。

因此,您必须:

  1. 声明 SubscriberContextProviding 为 class-bound:

    protocol SubscriberContextProviding: AnyObject { ... }
    

  2. 保持你的协议不变,但让你的 subscriber 变量可变,以考虑它包含值类型的可能性。