TEAM LICENSES: Save money and learn new skills through a Hacking with Swift+ team license >>

SOLVED: Dynamic Query in SwiftData is failing

Forums > Swift

I am trying to build a Query in my view's init to select all child rows in a parent child relationship. And while my child class is defined as

@Model
final class Card {
    var cardDate: Date = Date()
    @Relationship(deleteRule: .nullify, inverse: \EventType.card) var eventName: EventType?
    @Attribute(.externalStorage) var cardFront: Data = (UIImage(named: "frontImage")?.pngData())!
    var recipient: Recipient?

    init(cardDate: Date, eventName: EventType, cardFront: Data, recipient: Recipient) {
        self.cardDate = cardDate
        self.eventName = eventName
        self.cardFront = cardFront
        self.recipient = recipient
    }
}

my Query is receiving "no exact matches in call to initializer

    init(recipient: Recipient) {
        self.recipient = recipient
        _cards = Query(filter: #Predicate {
            return $0.recipient == recipient
        }, sort: [ 

Expanding the macro here -

Foundation.Predicate({
    return PredicateExpressions.build_Equal( 
        lhs: PredicateExpressions.build_KeyPath(
            root: PredicateExpressions.build_Arg($0),
            keyPath: \.recipient
        ),
        rhs: PredicateExpressions.build_Arg(recipient)
    )
    })

And the rest of the class here

            SortDescriptor(\Card.cardDate, order: .reverse),
            SortDescriptor(\Card.eventName, order: .forward),
        ])
    }

The error is a the return PredicateExpression.build_Equal and states

/var/folders/g0/1lsdnfdn1xv6876yb5m10y340000gn/T/swift-generated-sources/@__swiftmacro_11CardTracker010ViewEventsC0V9recipientAcA9RecipientC_tcfc9PredicatefMf_.swift:2:33 Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable<Array<Card>.Element>, Recipient?>, PredicateExpressions.Value<Recipient?>>' (aka 'PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable<Card>, Optional<Recipient>>, PredicateExpressions.Value<Optional<Recipient>>>') to closure result type 'any StandardPredicateExpression<Bool>'

How I am to setup the filter #Predicate when there is a relationship like this? The parent is recipient class which is defined as

@Model
final class Recipient {
    var addressLine1: String = ""
    var addressLine2: String = ""
    var city: String = ""
    var state: String = ""
    var zip: String = ""
    var country: String = ""
    var firstName: String = ""
    var lastName: String = ""
    @Relationship(deleteRule: .cascade, inverse: \Card.recipient) var cards: [Card]?

    var fullName: String {
        String("\(firstName) \(lastName)")
    }

    init(addressLine1: String, addressLine2: String, city: String, state: String, zip: String, country: String, firstName: String, lastName: String) {
        self.addressLine1 = addressLine1
        self.addressLine2 = addressLine2
        self.city = city
        self.state = state
        self.zip = zip
        self.country = country
        self.firstName = firstName
        self.lastName = lastName
    }
}

2      

Ok, problem solved with this StackOverflow Help .

So now the init looks like this

   self.recipient = recipient
        let recipientID = recipient.persistentModelID // Note this is required to help in Macro Expansion
        _cards = Query(
            filter: #Predicate {$0.recipient?.persistentModelID == recipientID },
            sort: [
                SortDescriptor(\Card.cardDate, order: .reverse),
                SortDescriptor(\Card.event?.eventName, order: .forward)
            ]
        )

2      

Hacking with Swift is sponsored by Blaze.

SPONSORED Still waiting on your CI build? Speed it up ~3x with Blaze - change one line, pay less, keep your existing GitHub workflows. First 25 HWS readers to use code HACKING at checkout get 50% off the first year. Try it now for free!

Reserve your spot now

Sponsor Hacking with Swift and reach the world's largest Swift community!

Reply to this topic…

You need to create an account or log in to reply.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.