最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

SwiftData issue with PredicateExpressions - Stack Overflow

programmeradmin5浏览0评论

Unfortunately, I get the following error when compiling. I am getting desperate.

Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable, Object?>, PredicateExpressions.Value<Object?>>' to closure result type 'any StandardPredicateExpression'

static func getChildObjects(for object: Object, context: ModelContext) -> [Object] {
    let relationPredicate = #Predicate<AttributValue> { $0.getValueAsObjectId() == object.id }

    let descriptor = FetchDescriptor<AttributValue>(predicate: relationPredicate)

    do {
        let attributValues = try context.fetch(descriptor)
        let objects = attributValuespactMap { $0.attribut?.object }

        // Sortiere die Objekte nach Kategorie (alphabetisch)
        return objects.sorted { $0.category.displayName < $1.category.displayName }
    } catch {
        print("Fehler beim Abrufen der Kind-Objekte: \(error.localizedDescription)")
        return []
    }
}

@Model
final class Object: Hashable {
    var id: UUID
    var name: String
    var version: String
    var category: ObjectCategory
    .....
    @Relationship var pattern: ObjectPattern?
    @Relationship(deleteRule: .cascade) var attributes: [Attribut]
}

@Model
final class Attribut {
    var id: UUID
    var name: String                    // Technischer Name
    var category: AttributCategory      // siehe enum AttributCategory
    var displayName: String?            // Anzeigename in der UI
    .....
    var objectTyp: ObjectCategory?      // category == .relation, dann regelt das die Relation auf ObjectCategory
    // Beziehung zum ObjectPattern
    @Relationship(inverse: \Object.attributes) var object: Object?
    @Relationship(deleteRule: .cascade) var values: [AttributValue]

}

@Model
final class AttributValue {
    // Eindeutige Identifikation des Attributwerts
    var id: UUID
    // Beziehung zu einem Attribut (gibt an, zu welchem Attribut dieser Wert gehört)
    @Relationship var attribut: Attribut?
    
    // Datencontainer für verschiedene Datentypen
    // Diese Variabeln sind optional, da immer nur eine Variable gesetzt wird.
    var integerValue: Int?    // Ganzzahlwert
    var numberValue: Double?  // Dezimalwert
    var textValue: String?    // Textwert
    var booleanValue: Bool?   // Wahrheitswert
    var dateValue: Date?      // Datum/Wert
    var urlValue: URL?        // URL
    var pickerValue: String?  // Auswahl aus einem Picker (Text)
    @Relationship var relationValue: Object?    // Verweis auf ein anderes Objekt
    ....
}

´´´´

Unfortunately, I get the following error when compiling. I am getting desperate.

Cannot convert value of type 'PredicateExpressions.Equal<PredicateExpressions.KeyPath<PredicateExpressions.Variable, Object?>, PredicateExpressions.Value<Object?>>' to closure result type 'any StandardPredicateExpression'

static func getChildObjects(for object: Object, context: ModelContext) -> [Object] {
    let relationPredicate = #Predicate<AttributValue> { $0.getValueAsObjectId() == object.id }

    let descriptor = FetchDescriptor<AttributValue>(predicate: relationPredicate)

    do {
        let attributValues = try context.fetch(descriptor)
        let objects = attributValuespactMap { $0.attribut?.object }

        // Sortiere die Objekte nach Kategorie (alphabetisch)
        return objects.sorted { $0.category.displayName < $1.category.displayName }
    } catch {
        print("Fehler beim Abrufen der Kind-Objekte: \(error.localizedDescription)")
        return []
    }
}

@Model
final class Object: Hashable {
    var id: UUID
    var name: String
    var version: String
    var category: ObjectCategory
    .....
    @Relationship var pattern: ObjectPattern?
    @Relationship(deleteRule: .cascade) var attributes: [Attribut]
}

@Model
final class Attribut {
    var id: UUID
    var name: String                    // Technischer Name
    var category: AttributCategory      // siehe enum AttributCategory
    var displayName: String?            // Anzeigename in der UI
    .....
    var objectTyp: ObjectCategory?      // category == .relation, dann regelt das die Relation auf ObjectCategory
    // Beziehung zum ObjectPattern
    @Relationship(inverse: \Object.attributes) var object: Object?
    @Relationship(deleteRule: .cascade) var values: [AttributValue]

}

@Model
final class AttributValue {
    // Eindeutige Identifikation des Attributwerts
    var id: UUID
    // Beziehung zu einem Attribut (gibt an, zu welchem Attribut dieser Wert gehört)
    @Relationship var attribut: Attribut?
    
    // Datencontainer für verschiedene Datentypen
    // Diese Variabeln sind optional, da immer nur eine Variable gesetzt wird.
    var integerValue: Int?    // Ganzzahlwert
    var numberValue: Double?  // Dezimalwert
    var textValue: String?    // Textwert
    var booleanValue: Bool?   // Wahrheitswert
    var dateValue: Date?      // Datum/Wert
    var urlValue: URL?        // URL
    var pickerValue: String?  // Auswahl aus einem Picker (Text)
    @Relationship var relationValue: Object?    // Verweis auf ein anderes Objekt
    ....
}

´´´´

Share Improve this question asked Mar 20 at 14:01 Peter BienPeter Bien 576 bronze badges 2
  • 1 $0.getValueAsObjectId(), you can't use a custom function inside a predicate. What does the function do, is it really necessary? – Joakim Danielson Commented Mar 20 at 18:10
  • This function reads all objects that point to me via Attribut.AutoValue.relationValue – Peter Bien Commented Mar 21 at 14:40
Add a comment  | 

1 Answer 1

Reset to default 0

I have solved the problem by setting a local variable.

static func getChildObjects(for object: Object, context: ModelContext) -> [Object] {
        let objId = object.id
       
        let fetchDescriptor = FetchDescriptor<AttributValue>(
            predicate: #Predicate { $0.relationValue?.id == objId } // Use the local variable
            )
       
发布评论

评论列表(0)

  1. 暂无评论