Xcode报错:Invalid conversion from throwing function of type ‘() throws -> Void’ to non-throwing function type ‘() -> Void’
Xcode报错:Invalid conversion from throwing function of type ‘() throws -> Void’ to non-throwing function type ‘() -> Void’

Xcode报错:Invalid conversion from throwing function of type ‘() throws -> Void’ to non-throwing function type ‘() -> Void’

在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语句。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注