类型 'T' 的值没有使用来自根类型 'T' 的键路径的动态成员 'object'

Value of type 'T' has no dynamic member 'object' using key path from root type 'T'

我有一个 class 这样的:

class ObjectA:ObservableObject { 
  @Published var type:ObjectSheetType = .none
}

我正在使用这样的 class 来处理此类对象的实例:

class ProcessObject {

  @ObservedObject private var object:ObjectA

  init(object:ObjectA) {
    self.object = object
  }

  process() {
    if object.type == .big {
     // bla bla
    }
    ...
  }

那我决定再加一个class:

class ObjectB:ObservableObject { 
  @Published var type:ObjectSheetType = .none
}

和协议

protocol ObjectProtocol {
  var type:ObjectSheetType { get set }
}

此协议已添加到 classes:ObjectAObjectB

然后 class ProcessObject 被修改为接受两种对象:

class processObject<T:ObjectProtocol, ObservableObject > {

  @ObservedObject private var object:T

  init(object:T) {
    self.object = object
  }

Error: Referencing subscript 'subscript(dynamicMember:)' requires wrapper 'ObservedObject.Wrapper' Insert '$' Value of type 'T' has no dynamic member 'object' using key path from root type 'T'

错误指向

if object.type == .big {

而且 Xcode 希望我在 object?

的每个已发布属性前使用 $

我该如何解决这个问题?

您需要做的就是修复 T 的协议一致性,因为现在 ObservableObject 被视为另一种通用类型,而不是协议。

用 & 表示 T 应该同时符合这两个协议

class ProcessObject<T: ObjectProtocol & ObservableObject> {

}

另一种说法是ObjectProtocol继承自ObservableObject,然后在所有的conform声明中只使用ObjectProtocol

protocol ObjectProtocol: ObservableObject {
    var type:ObjectSheetType { get set }
}

但这改变了 ObjectProtocol 的含义,您可能不希望两个协议之间存在紧密耦合