我有一个类似的对象:
class MyObject {
var title:String? = nil
var value:Int? = nil
var otherData:[String] = []
}
我正在尝试存储一个异构的更新数组,以便以后可以使用它们来设置值。像这样的东西。
class SomeFormThing {
func getUpdates() -> [WritableKeyPath<MyObject, Any> : Any] {
var updates:[WritableKeyPath<MyObject, Any> : Any]
updates[\MyObject.title] = "New Title"
updates[\MyObject.value] = 0
updates[\MyObject.value] = ["Other", "Values"]
return updates
}
}
class SyncManager {
var form:SomeFormThing = SomeFormThing()
var sync:MyObject = MyObject()
func updateValues() {
let updates = form.getUpdates()
for key in updates.keys {
sync[forKeyPath: key] = updates[key]
}
}
}
但是,这当然在 getUpdates() 中读取Cannot convert value of type 'WritableKeyPath<MyObject, String?>' to expected argument type 'WritableKeyPath<MyObject, Any>'
.
需要有一组异构的可写键路径,然后我可以使用它们来设置值。鉴于泛型通常如何工作,我不明白为什么 String 不能等同于 Any 泛型,因为该类型是向下转换的。