diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/Palette.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/Palette.swift index 07fd502..dfa1b36 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/Palette.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/Palette.swift @@ -23,18 +23,18 @@ final class Palette: CoreStoreObject { let colorName = Value.Optional( "colorName", isTransient: true, - customGetter: Palette.getCachedColorName + customGetter: Palette.getColorName ) - private static func getCachedColorName(_ instance: Palette, _ getValue: () -> String?) -> String? { + private static func getColorName(_ partialObject: PartialObject) -> String? { - if let colorName = getValue() { + if let colorName = partialObject.primitiveValue(for: { $0.colorName }) { return colorName } let colorName: String - switch instance.hue.value % 360 { + switch partialObject.value(for: { $0.hue }) % 360 { case 0 ..< 20: colorName = "Lower Reds" case 20 ..< 57: colorName = "Oranges and Browns" @@ -47,7 +47,7 @@ final class Palette: CoreStoreObject { default: colorName = "Upper Reds" } - instance.colorName.primitiveValue = colorName + partialObject.setPrimitiveValue(colorName, for: { $0.colorName }) return colorName } } diff --git a/CoreStoreTests/DynamicModelTests.swift b/CoreStoreTests/DynamicModelTests.swift index b55b4bb..20081bf 100644 --- a/CoreStoreTests/DynamicModelTests.swift +++ b/CoreStoreTests/DynamicModelTests.swift @@ -51,40 +51,50 @@ class Dog: Animal { } class Person: CoreStoreObject { + let title = Value.Required( "title", default: "Mr.", - customSetter: { (`self`, setValue, originalNewValue) in - - setValue(originalNewValue) - self.displayName .= nil - } + customSetter: Person.setTitle ) + let name = Value.Required( "name", - customSetter: { (`self`, setValue, originalNewValue) in - - setValue(originalNewValue) - self.displayName .= nil - } + customSetter: Person.setName ) + let displayName = Value.Optional( "displayName", isTransient: true, - customGetter: Person.cachedDisplayName(_:_:), + customGetter: Person.getDisplayName(_:), affectedByKeyPaths: Person.keyPathsAffectingDisplayName() ) + let pets = Relationship.ToManyUnordered("pets", inverse: { $0.master }) - static func cachedDisplayName(_ instance: Person, _ getValue: () -> String?) -> String? { + private static func setTitle(_ partialObject: PartialObject, _ newValue: String) { - if let cached = getValue() { + partialObject.setPrimitiveValue(newValue, for: { $0.title }) + partialObject.setPrimitiveValue(nil, for: { $0.displayName }) + } + + private static func setName(_ partialObject: PartialObject, _ newValue: String) { + + partialObject.setPrimitiveValue(newValue, for: { $0.name }) + partialObject.setPrimitiveValue(nil, for: { $0.displayName }) + } + + static func getDisplayName(_ partialObject: PartialObject) -> String? { + + if let displayName = partialObject.primitiveValue(for: { $0.displayName }) { - return cached + return displayName } - let primitiveValue = "\(instance.title.value) \(instance.name.value)" - instance.displayName .= primitiveValue - return primitiveValue + let title = partialObject.value(for: { $0.title }) + let name = partialObject.value(for: { $0.name }) + let displayName = "\(title) \(name)" + partialObject.setPrimitiveValue(displayName, for: { $0.displayName }) + return displayName } static func keyPathsAffectingDisplayName() -> Set {