我有一个这样的类:
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 }
}
该协议被添加到两个类:ObjectA
和ObjectB
。
然后类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,您可能不希望两个协议之间的紧密耦合