From 12c5aeaaa46b1b5a4055cc87071c46d41f845464 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Fri, 21 Feb 2020 10:36:28 +0900 Subject: [PATCH] safer casting --- Sources/ObjectProxy.swift | 12 ++++++------ Sources/ObjectPublisher.swift | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Sources/ObjectProxy.swift b/Sources/ObjectProxy.swift index 8e25731..cd2f61e 100644 --- a/Sources/ObjectProxy.swift +++ b/Sources/ObjectProxy.swift @@ -133,11 +133,11 @@ public struct ObjectProxy { let keyPathString = field.keyPath self.getValue = { - return FieldContainer.Stored.read(field: field, for: rawObject) as! V + return type(of: field).read(field: field, for: rawObject) as! V } self.setValue = { - FieldContainer.Stored.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 { let keyPathString = field.keyPath self.getValue = { - return FieldContainer.Virtual.read(field: field, for: rawObject) as! V + return type(of: field).read(field: field, for: rawObject) as! V } self.setValue = { - FieldContainer.Virtual.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 { let keyPathString = field.keyPath self.getValue = { - return FieldContainer.Coded.read(field: field, for: rawObject) as! V + return type(of: field).read(field: field, for: rawObject) as! V } self.setValue = { - FieldContainer.Coded.modify(field: field, for: rawObject, newValue: $0) + type(of: field).modify(field: field, for: rawObject, newValue: $0) } self.getPrimitiveValue = { diff --git a/Sources/ObjectPublisher.swift b/Sources/ObjectPublisher.swift index 2f65fff..286e0bc 100644 --- a/Sources/ObjectPublisher.swift +++ b/Sources/ObjectPublisher.swift @@ -379,7 +379,8 @@ extension ObjectPublisher where O: CoreStoreObject { return nil } - return FieldContainer.Stored.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.Virtual.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.Coded.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.Relationship.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)