我正在编写一个自定义更新方法,以便控制如何在Realm中表示值。采用的方法是将传入的键:值(来自JSON)与对象的objectSchema.properties进行匹配,并相应地转换值。一切都是通用的,使用Object.subscript存储值。
对于to-one关系,其中属性类型为.Object,系统可以递归并创建或更新由Property.objectClassName确定的类型的相应嵌套对象。
对于to-many关系,其中属性类型为.Array我们必须修改objectClassName类型的对象List。然而,列表是通用的,因此List<具体类型的objectClassName>。
As Object.subscript返回AnyObject类型的值?我们需要将其转换为可以作为列表处理的内容,而不管其包含的类型。如何实现这一目标?
(我已经替换了下面的示例来更好地说明问题) e.g。
typealias ValueDictionary = Dictionary<String, AnyObject>
func update(object: Object, values: ValueDictionary) {
for property in object.objectSchema.properties {
if let value = values[property.name] {
var newValue: AnyObject?
switch property.type {
case .Object:
let objectType = NSClassFromString(
"mymodule" + property.objectClassName) as! Object.Type
newValue = relatedObjectWithType(objectType,
values: value as! ValueDictionary)
case .Array:
let objectType = NSClassFromString(
"mymodule" + property.objectClassName) as! Object.Type
newValue = listOfRelatedObjectsWithType(objectType,
values: value as! [ValueDictionary])
default:
// Convert primitive values, date strings, etc.
newValue = coerceValue(value, toPropertyType:property.type)
}
}
}
func relatedObjectWithClassName(type: Object.Type, values: ValueDictionary) -> Object {
// To-one relations can be instantiated using Object.Type.
var object = type.init()
update(object, values)
return object
}
// To-many relation are generic so there's no way to treat them dynamically.
func listOfRelatedObjectsWithType(type: Object.Type, values: [ValueDictionary]) -> List {
}