ManagedModels icon indicating copy to clipboard operation
ManagedModels copied to clipboard

Backport Foundation `Predicate`s

Open helje5 opened this issue 2 years ago • 2 comments

The Foundation Predicate is available in the open source Foundation. I think it requires iOS 17+ because it uses variadic generics. But that's not actually necessary for the SwiftData APIs which only pass in a single model type.

This should probably go into an own package.

helje5 avatar Oct 04 '23 13:10 helje5

Has there ever been any progress towards this?

I've been playing around with Predicates + ManagedModels but always run into a dead-end seemingly because Model properties aren't exposed to the underlying Objective-C runtime so code like this doesn't work:


@Model
final class MyModel: NSManagedObject {
  var enabled: Bool

  convenience init() {
    self.enabled = false
  }
}

// the following works if MyModel is created using the traditional NSManagedObject / @NSManaged means

let p = #Predicate<MyModel> { $0.enabled == true } 
let predicate = NSPredicate(p) // returns nil, because apparently MyModel.enabled isn't bridged

Likewise a simple NSExpression(forKeyPath: \MyModel.enabled) fails with "Foundation/NSObject.swift:132: Fatal error: Could not extract a String from KeyPath \MyModel.enabled"

The same issue breaks interoperability with packages like PredicateKit which relies on being able to convert AnyKeyPath to String using ObjC bridging internals.

HealsCodes avatar Oct 29 '24 12:10 HealsCodes

I haven't seen a Predicate back port yet, but that seems unrelated to your issue (and this becomes less necessary as time goes by). I've created #36 for this.

helje5 avatar Oct 29 '24 13:10 helje5