Supports non-NSManagedObjects for @Managed properties

This allows us to use @Managed with properties that may or may not be NSManagedObjects at runtime (e.g. protocols). If they are, Managed will keep strong reference to context like before.
This commit is contained in:
nythepegasus
2024-05-09 00:27:03 -04:00
committed by ny
parent 4667841c8d
commit dd0436511a

View File

@@ -10,23 +10,27 @@ import Foundation
import CoreData import CoreData
@propertyWrapper @dynamicMemberLookup @propertyWrapper @dynamicMemberLookup
struct Managed<ManagedObject: NSManagedObject> struct Managed<ManagedObject>
{ {
var wrappedValue: ManagedObject { var wrappedValue: ManagedObject {
didSet { didSet {
self.managedObjectContext = self.wrappedValue.managedObjectContext self.managedObjectContext = self.managedObject?.managedObjectContext
} }
} }
private var managedObjectContext: NSManagedObjectContext?
var projectedValue: Managed<ManagedObject> { var projectedValue: Managed<ManagedObject> {
return self return self
} }
private var managedObjectContext: NSManagedObjectContext?
private var managedObject: NSManagedObject? {
return self.wrappedValue as? NSManagedObject
}
init(wrappedValue: ManagedObject) init(wrappedValue: ManagedObject)
{ {
self.wrappedValue = wrappedValue self.wrappedValue = wrappedValue
self.managedObjectContext = wrappedValue.managedObjectContext self.managedObjectContext = self.managedObject?.managedObjectContext
} }
subscript<T>(dynamicMember keyPath: KeyPath<ManagedObject, T>) -> T subscript<T>(dynamicMember keyPath: KeyPath<ManagedObject, T>) -> T