Я получаю фатальную ошибку при попытке определить модель 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
}
}
но все же я не уверен, почему это работает так, что я не могу вкладывать перечисления...
Да, я думаю, это тоже нужно решить. Но тем не менее, даже если проблема будет решена, этот код не скомпилируется и вылетит с той же фатальной ошибкой @JoakimDanielson.
Если вы перейдете с
case aCase(Set<MyEnum>)
к
case aCase([MyEnum])
ваш код работает нормально. Кажется, что в данных Swift есть проблема только с Set
.
Да, кажется, это сработало. Хотя мне нужно было немного переписать логику, потому что я работал с Set, а теперь и с Array.
Каждый раз, когда вы получаете доступ к свойству
id
любого из типов перечислений, вы получаете обратно новое значение. Действительно ли это ожидаемое поведение? То естьMyEnum.aCase.id == MyEnum.aCase.id
всегда будет ложным.