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



我有一个这样的类:

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

我用这样一个类来处理这种对象的实例:

class ProcessObject {
@ObservedObject private var object:ObjectA
init(object:ObjectA) {
self.object = object
}
process() {
if object.type == .big {
// bla bla
}
...
}

然后我决定添加另一个类:

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

和协议

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

该协议被添加到两个类:ObjectAObjectB

然后类ProcessObject被修改为接受两种类型的对象:

class processObject<T:ObjectProtocol, ObservableObject > {
@ObservedObject private var object:T
init(object:T) {
self.object = object
}

错误:引用下标"subscript(dynamicMember:("需要包装器"ObservedObject"。包装器'插入"$"T"类型的值没有使用根类型"T"的密钥路径的动态成员"对象">

指向的错误

if object.type == .big {

但Xcode也希望我在object的每个已发布属性前面使用$?

我该如何解决此问题?

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

使用&说T应该符合两个协议

class ProcessObject<T: ObjectProtocol & ObservableObject> {
}

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

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

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

最新更新