safer casting

This commit is contained in:
John Estropia
2020-02-21 10:36:28 +09:00
parent dd3fb17dd0
commit 12c5aeaaa4
2 changed files with 18 additions and 11 deletions

View File

@@ -133,11 +133,11 @@ public struct ObjectProxy<O: CoreStoreObject> {
let keyPathString = field.keyPath
self.getValue = {
return FieldContainer<OBase>.Stored<V>.read(field: field, for: rawObject) as! V
return type(of: field).read(field: field, for: rawObject) as! V
}
self.setValue = {
FieldContainer<OBase>.Stored<V>.modify(field: field, for: rawObject, newValue: $0)
type(of: field).modify(field: field, for: rawObject, newValue: $0)
}
self.getPrimitiveValue = {
@@ -159,11 +159,11 @@ public struct ObjectProxy<O: CoreStoreObject> {
let keyPathString = field.keyPath
self.getValue = {
return FieldContainer<OBase>.Virtual<V>.read(field: field, for: rawObject) as! V
return type(of: field).read(field: field, for: rawObject) as! V
}
self.setValue = {
FieldContainer<OBase>.Virtual<V>.modify(field: field, for: rawObject, newValue: $0)
type(of: field).modify(field: field, for: rawObject, newValue: $0)
}
self.getPrimitiveValue = {
@@ -192,11 +192,11 @@ public struct ObjectProxy<O: CoreStoreObject> {
let keyPathString = field.keyPath
self.getValue = {
return FieldContainer<OBase>.Coded<V>.read(field: field, for: rawObject) as! V
return type(of: field).read(field: field, for: rawObject) as! V
}
self.setValue = {
FieldContainer<OBase>.Coded<V>.modify(field: field, for: rawObject, newValue: $0)
type(of: field).modify(field: field, for: rawObject, newValue: $0)
}
self.getPrimitiveValue = {

View File

@@ -379,7 +379,8 @@ extension ObjectPublisher where O: CoreStoreObject {
return nil
}
return FieldContainer<OBase>.Stored<V>.read(field: object[keyPath: member], for: rawObject) as! V?
let field = object[keyPath: member]
return type(of: field).read(field: field, for: rawObject) as! V?
}
/**
@@ -394,7 +395,8 @@ extension ObjectPublisher where O: CoreStoreObject {
return nil
}
return FieldContainer<OBase>.Virtual<V>.read(field: object[keyPath: member], for: rawObject) as! V?
let field = object[keyPath: member]
return type(of: field).read(field: field, for: rawObject) as! V?
}
/**
@@ -409,7 +411,8 @@ extension ObjectPublisher where O: CoreStoreObject {
return nil
}
return FieldContainer<OBase>.Coded<V>.read(field: object[keyPath: member], for: rawObject) as! V?
let field = object[keyPath: member]
return type(of: field).read(field: field, for: rawObject) as! V?
}
/**
@@ -419,12 +422,16 @@ extension ObjectPublisher where O: CoreStoreObject {
guard
let object = self.object,
let rawObject = object.rawObject,
let value = FieldContainer<OBase>.Relationship<V>.read(field: object[keyPath: member], for: rawObject) as! V?
let rawObject = object.rawObject
else {
return nil
}
let field = object[keyPath: member]
guard let value = type(of: field).read(field: field, for: rawObject) as! V? else {
return nil
}
let nativeValue = V.cs_toNativeType(from: value)
let snapshotValue = V.cs_valueForSnapshot(from: nativeValue)
return V.cs_toPublishedType(from: snapshotValue, in: self.context)