You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Predicate无法永久删除SwiftData模型的问题排查

SwiftData使用Predicate删除模型失效问题

我开发了一个SwiftData应用,模型定义如下:

@Model final class User: ObservableObject, Equatable {
    @Attribute(.unique) var id: UUID = UUID()
    //...
}

当我尝试通过以下代码删除模型时:

List { ForEach(users, id: \.id) { aUser in

    //...

    HStack {
        Text("\(aUser.name)")
        Image(systemName: "minus.circle.fill")
            .foregroundStyle(.red)
            .onTapGesture {
                let theID = aUser.id // < 获取选中用户的引用,否则Predicate会崩溃
                print(theID.uuidString) // < 控制台输出预期的字符串

                // vv 如果使用anItem.id.uuidString == theID.uuidString会崩溃
                try? modelContext.delete(model: User.self, where: #Predicate<User> { anItem in anItem.id ==  theID })

                print(modelContext.hasChanges) // < **始终**为false
                modelContext.save()
            }
        }

    // ...
}

看似删除了用户(偶尔删除的不是正确的用户),但重启应用后被删除的用户会重新出现。

而使用以下不借助Predicate的代码:

for i in 0 ..< users.count {
    if users[i].id.uuidString == theID.uuidString {
        modelContext.delete(users[i])
        break
    }
}

print(modelContext.hasChanges) // < 找到用户时输出true

则一切正常,用户会被永久删除。

我曾猜测UUID实例比较可能总是返回false,但这无法解释“看似删除但重启后恢复”的现象。出于代码简洁性的考虑,我希望使用Predicate,因此想了解第一种代码无法正常工作的原因。

编辑
根据评论建议,我提供了一个SwiftFiddle示例,其中删除Item的操作更稳定,但通过Predicate删除时,.hasChanges始终为false,这是否是一个Bug?

内容的提问来源于stack exchange,提问作者Todd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:43:11