
在Xcode保存SwiftData的代码中:
Button(action: {
let piggyBank = PiggyBank(name: piggyBankData.name, amount: piggyBankData.amount, icon: piggyBankData.icon, initialAmount: piggyBankData.initialAmount, isExpirationDateEnabled: piggyBankData.isExpirationDateEnabled, expirationDate: piggyBankData.expirationDate, remark: piggyBankData.remark)
modelContext.insert(piggyBank) // 将对象插入到上下文中
do {
try modelContext.save() // 提交上下文中的所有更改
} catch {
print("保存失败: \(error)")
}
var piggyBankArr = try modelContext.fetch(FetchDescriptor<PiggyBank>())
print("SwiftData现在有\(piggyBankArr.count)个")
pageSteps = 0
}, label: {
...
})
发现存在报错:
Invalid conversion from throwing function of type '() throws -> Void' to non-throwing function type '() -> Void'
经排查发现,问题为在显示SwiftData中PiggyBank实例数量的时候,try modelContext.fetch没有用do-catch语句包裹:
var piggyBankArr = try modelContext.fetch(FetchDescriptor<PiggyBank>())
print("SwiftData现在有\(piggyBankArr.count)个")
Swift 要求在非抛出环境中处理所有可能抛出的异常。在 Button 的 action 闭包中,默认情况下不能直接使用 try,因为该闭包的类型是非抛出的 () -> Void。
因此,解决方案就是使用do-catch语句包裹try语句:
do {
var piggyBankArr = try modelContext.fetch(FetchDescriptor<PiggyBank>())
print("SwiftData现在有\(piggyBankArr.count)个")
} catch {
print("查询出错。")
}
修改后,问题得到解决。

同类问题,请检查是否有类似的遗漏try语句。