I’m trying to use Predicate with generics but I keep getting the following compilation error :
Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.ConditionalCast<PredicateExpressions.KeyPath<PredicateExpressions.Variable<E.EntityType>, E.EntityType.PrimaryKey?>, Key>, PredicateExpressions.Value<Optional<Key>>>' to closure result type 'any StandardPredicateExpression<Bool>'
I have the following :
public protocol Entity {
associatedtype DomainModel
associatedtype PrimaryKey: Equatable
/// The entity's domain model
var domainModel: DomainModel { get }
/// The entity's primary key
var primaryKey: PrimaryKey { get }
}
public protocol DomainEntity {
associatedtype EntityType: PersistentModel & Entity
var entity: EntityType? { get }
}
@ModelActor
actor DataSource<E: DomainEntity> {
typealias Model = E.EntityType.DomainModel
func get<Key: Equatable>(by key: Key) throws -> Model? {
let predicate: Predicate<E.EntityType> = #Predicate {
($0.primaryKey as? Key) == key // I’m having the error here
}
let fetchDescriptor = FetchDescriptor<E.EntityType>(predicate: predicate)
guard let entity: E.EntityType = try modelContext.fetch(fetchDescriptor).first else {
return nil
}
guard let model = entity.domainModel as? Model else {
throw DatabaseError.conversionFailed
}
return model
}
}
I get that the error is kind of explaining that it can’t figure out the underlying types, but as both properties are Equatable, it shouldn’t be an issue.
Does anyone have an idea of how I could do such a comparison using predicates? Or is there another way?