diff --git a/CoreStoreTests/DynamicModelTests.swift b/CoreStoreTests/DynamicModelTests.swift index d9f817c..5d72143 100644 --- a/CoreStoreTests/DynamicModelTests.swift +++ b/CoreStoreTests/DynamicModelTests.swift @@ -362,6 +362,7 @@ class DynamicModelTests: BaseTestDataTestCase { XCTAssertEqual(person.name, personSnapshot1.$name) XCTAssertEqual(person.title, personSnapshot1.$title) XCTAssertEqual(person.displayName, personSnapshot1.$displayName) + XCTAssertEqual(person.job, personSnapshot1.$job) person.title = "Sir" XCTAssertEqual(person.displayName, "Sir John") @@ -380,15 +381,19 @@ class DynamicModelTests: BaseTestDataTestCase { XCTAssertEqual(person.name, personSnapshot2.$name) XCTAssertEqual(person.title, personSnapshot2.$title) XCTAssertEqual(person.displayName, personSnapshot2.$displayName) + XCTAssertEqual(person.job, personSnapshot2.$job) var personSnapshot3 = personSnapshot2 personSnapshot3.$name = "James" XCTAssertEqual(personSnapshot1.$name, "John") XCTAssertEqual(personSnapshot1.$displayName, "Mr. John") + XCTAssertEqual(personSnapshot1.$job, .unemployed) XCTAssertEqual(personSnapshot2.$name, "John") XCTAssertEqual(personSnapshot2.$displayName, "Sir John") + XCTAssertEqual(personSnapshot2.$job, .engineer) XCTAssertEqual(personSnapshot3.$name, "James") XCTAssertEqual(personSnapshot3.$displayName, "Sir John") + XCTAssertEqual(personSnapshot3.$job, .engineer) @@ -400,7 +405,15 @@ class DynamicModelTests: BaseTestDataTestCase { XCTAssertEqual(dog.master?.pets.first, dog) }, success: { _ in - + + let person = try! stack.fetchOne(From()) + XCTAssertNotNil(person) + + let personPublisher = person!.asPublisher(in: stack) + XCTAssertEqual(personPublisher.$name, "John") + XCTAssertEqual(personPublisher.$displayName, "Sir John") + XCTAssertEqual(personPublisher.$job, .engineer) + updateDone.fulfill() }, failure: { _ in diff --git a/Sources/ObjectPublisher.swift b/Sources/ObjectPublisher.swift index 26855cb..2f65fff 100644 --- a/Sources/ObjectPublisher.swift +++ b/Sources/ObjectPublisher.swift @@ -397,6 +397,21 @@ extension ObjectPublisher where O: CoreStoreObject { return FieldContainer.Virtual.read(field: object[keyPath: member], for: rawObject) as! V? } + /** + Returns the value for the property identified by a given key. + */ + public subscript(dynamicMember member: KeyPath.Coded>) -> V? { + + guard + let object = self.object, + let rawObject = object.rawObject + else { + + return nil + } + return FieldContainer.Coded.read(field: object[keyPath: member], for: rawObject) as! V? + } + /** Returns the value for the property identified by a given key. */ diff --git a/Sources/ObjectSnapshot.swift b/Sources/ObjectSnapshot.swift index 2458e3b..11902ec 100644 --- a/Sources/ObjectSnapshot.swift +++ b/Sources/ObjectSnapshot.swift @@ -209,6 +209,23 @@ extension ObjectSnapshot where O: CoreStoreObject { } } + /** + Returns the value for the property identified by a given key. + */ + public subscript(dynamicMember member: KeyPath.Coded>) -> V { + + get { + + let key = String(keyPath: member) + return self.values[key] as! V + } + set { + + let key = String(keyPath: member) + self.values[key] = newValue + } + } + /** Returns the value for the property identified by a given key. */