这是最基本的 SwiftData 设置,我在一个更大的应用程序中遇到问题后开始研究这个。在下面的示例中,问题是如果您多次按“Zoo”按钮,它只会添加一只“狮子”和一只“山羊”。如果添加打印,则函数将被正确调用,如果将 GLOBAL_ZOO 数组移动到函数本地,则函数将按预期工作。我假设这是 SwiftData 的一个缺陷,或者可能是一个错误,因为框架太新了,但我只是很好奇有人遇到过这个或者对可能发生的事情有任何了解吗?
// MARK: - TESTBED GLOBAL
let GLOBAL_ZOO = [Animal(name: "LION"), Animal(name: "GOAT")]
// MARK: - TESTBED CONTENT
struct ContentView: View {
@Environment(\.modelContext) var context
@Query var animals: [Animal]
var body: some View {
NavigationStack {
List(animals) { each in
Text("\(each.name)")
}
.navigationTitle("Animals")
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button("Add", action: addAnimals)
}
ToolbarItem(placement: .topBarLeading) {
Button("Zoo", action: zooAnimals)
}
ToolbarItem(placement: .topBarTrailing) {
Button("Del", action: delAnimals)
}
}
}
}
func zooAnimals() {
for each in GLOBAL_ZOO {
context.insert(each)
}
}
func addAnimals() {
let one = Animal(name: "FRED")
let two = Animal(name: "BERT")
context.insert(one)
context.insert(two)
}
func delAnimals() {
for each in animals {
context.delete(each)
}
}
}
全局对象将始终是相同的实例并具有相同的 id,因此 SwiftData 会将其识别为已存在并执行更新而不是插入(甚至不执行任何操作,因为新的和现有的相同)。