add Field.Coded dynamic lookups for ObjectPublisher and ObjectSnapshot

This commit is contained in:
John Estropia
2020-02-17 18:30:18 +09:00
parent 38e9878c04
commit 2d1b1e0592
3 changed files with 46 additions and 1 deletions

View File

@@ -362,6 +362,7 @@ class DynamicModelTests: BaseTestDataTestCase {
XCTAssertEqual(person.name, personSnapshot1.$name) XCTAssertEqual(person.name, personSnapshot1.$name)
XCTAssertEqual(person.title, personSnapshot1.$title) XCTAssertEqual(person.title, personSnapshot1.$title)
XCTAssertEqual(person.displayName, personSnapshot1.$displayName) XCTAssertEqual(person.displayName, personSnapshot1.$displayName)
XCTAssertEqual(person.job, personSnapshot1.$job)
person.title = "Sir" person.title = "Sir"
XCTAssertEqual(person.displayName, "Sir John") XCTAssertEqual(person.displayName, "Sir John")
@@ -380,15 +381,19 @@ class DynamicModelTests: BaseTestDataTestCase {
XCTAssertEqual(person.name, personSnapshot2.$name) XCTAssertEqual(person.name, personSnapshot2.$name)
XCTAssertEqual(person.title, personSnapshot2.$title) XCTAssertEqual(person.title, personSnapshot2.$title)
XCTAssertEqual(person.displayName, personSnapshot2.$displayName) XCTAssertEqual(person.displayName, personSnapshot2.$displayName)
XCTAssertEqual(person.job, personSnapshot2.$job)
var personSnapshot3 = personSnapshot2 var personSnapshot3 = personSnapshot2
personSnapshot3.$name = "James" personSnapshot3.$name = "James"
XCTAssertEqual(personSnapshot1.$name, "John") XCTAssertEqual(personSnapshot1.$name, "John")
XCTAssertEqual(personSnapshot1.$displayName, "Mr. John") XCTAssertEqual(personSnapshot1.$displayName, "Mr. John")
XCTAssertEqual(personSnapshot1.$job, .unemployed)
XCTAssertEqual(personSnapshot2.$name, "John") XCTAssertEqual(personSnapshot2.$name, "John")
XCTAssertEqual(personSnapshot2.$displayName, "Sir John") XCTAssertEqual(personSnapshot2.$displayName, "Sir John")
XCTAssertEqual(personSnapshot2.$job, .engineer)
XCTAssertEqual(personSnapshot3.$name, "James") XCTAssertEqual(personSnapshot3.$name, "James")
XCTAssertEqual(personSnapshot3.$displayName, "Sir John") XCTAssertEqual(personSnapshot3.$displayName, "Sir John")
XCTAssertEqual(personSnapshot3.$job, .engineer)
@@ -401,6 +406,14 @@ class DynamicModelTests: BaseTestDataTestCase {
}, },
success: { _ in success: { _ in
let person = try! stack.fetchOne(From<Person>())
XCTAssertNotNil(person)
let personPublisher = person!.asPublisher(in: stack)
XCTAssertEqual(personPublisher.$name, "John")
XCTAssertEqual(personPublisher.$displayName, "Sir John")
XCTAssertEqual(personPublisher.$job, .engineer)
updateDone.fulfill() updateDone.fulfill()
}, },
failure: { _ in failure: { _ in

View File

@@ -397,6 +397,21 @@ extension ObjectPublisher where O: CoreStoreObject {
return FieldContainer<OBase>.Virtual<V>.read(field: object[keyPath: member], for: rawObject) as! V? return FieldContainer<OBase>.Virtual<V>.read(field: object[keyPath: member], for: rawObject) as! V?
} }
/**
Returns the value for the property identified by a given key.
*/
public subscript<OBase, V>(dynamicMember member: KeyPath<O, FieldContainer<OBase>.Coded<V>>) -> V? {
guard
let object = self.object,
let rawObject = object.rawObject
else {
return nil
}
return FieldContainer<OBase>.Coded<V>.read(field: object[keyPath: member], for: rawObject) as! V?
}
/** /**
Returns the value for the property identified by a given key. Returns the value for the property identified by a given key.
*/ */

View File

@@ -209,6 +209,23 @@ extension ObjectSnapshot where O: CoreStoreObject {
} }
} }
/**
Returns the value for the property identified by a given key.
*/
public subscript<OBase, V>(dynamicMember member: KeyPath<O, FieldContainer<OBase>.Coded<V>>) -> 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. Returns the value for the property identified by a given key.
*/ */