SwiftData: неустранимая ошибка «Неожиданный тип для CompositeAttribute: Встроенный.BridgeObject» при использовании вложенных перечислений в модели

Я получаю фатальную ошибку при попытке определить модель SwiftData, включающую вложенные перечисления. Сообщение об ошибке, которое я получаю:

SwiftData/SchemaProperty.swift:373: Неустранимая ошибка: неожиданный тип для CompositeAttribute: Встроенный.BridgeObject

Вот упрощенная версия моего кода, которая может воспроизвести проблему:

import SwiftUI
import SwiftData

enum MyEnum: Identifiable, Codable {
    var id: String { UUID().uuidString }
    case aCase
}

enum MyOtherEnum: Identifiable, Codable {
    var id: String { UUID().uuidString }
    case aCase(Set<MyEnum>)
}

@Model
final class MyModel: Identifiable {

    init(id: String? = nil, something: MyOtherEnum? = nil) {
        self.id = id
        self.something = something
    }

    @Attribute(.unique)
    private(set) var id: String?

    private(set) var something: MyOtherEnum?
}


struct ContentView: View {
    var body: some View {
       Text("Content View")
    }
}

и:

import SwiftUI
import SwiftData

@main

    struct MyApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .modelContainer(for: [
                        MyModel.self
                    ])
            }
        }
    }

Я предполагаю, что SwiftData может не справиться с вложением, например Set<MyEnum>?

Обновлено:

Думаю, я мог бы пойти с:

struct MyOtherEnum: Identifiable, Codable {
    let id: String
    let nestedEnum: Set<MyEnum>

    init(id: String? = nil, nestedEnum: Set<MyEnum>) {
        self.id = id ?? UUID().uuidString
        self.nestedEnum = nestedEnum
    }
}

но все же я не уверен, почему это работает так, что я не могу вкладывать перечисления...

Каждый раз, когда вы получаете доступ к свойству id любого из типов перечислений, вы получаете обратно новое значение. Действительно ли это ожидаемое поведение? То есть MyEnum.aCase.id == MyEnum.aCase.id всегда будет ложным.

Joakim Danielson 15.04.2024 10:47

Да, я думаю, это тоже нужно решить. Но тем не менее, даже если проблема будет решена, этот код не скомпилируется и вылетит с той же фатальной ошибкой @JoakimDanielson.

Whirlwind 15.04.2024 11:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
213
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы перейдете с case aCase(Set<MyEnum>) к case aCase([MyEnum])

ваш код работает нормально. Кажется, что в данных Swift есть проблема только с Set.

Да, кажется, это сработало. Хотя мне нужно было немного переписать логику, потому что я работал с Set, а теперь и с Array.

Whirlwind 15.04.2024 12:08

Другие вопросы по теме