首页 > 解决方案 > UIAlert 无法将类型“(_) throws -> ()”的值转换为预期的参数类型“((UIAlertAction) -> Void)?”

问题描述

我一直在寻找解决我在UIAlertAction. 对于给定的数字,我想将 SQLite 数据库中的值从 true 更新为 false。我已经设法让 if/else 循环正常工作,所以我知道我进入了正确的位置。但是当我尝试从 UIAlertAction 运行数据库更新查询时,我得到了上述错误。

下面的代码:

} else {
    print ("Badge in School - check out")
    let checkOut = UIAlertController(title: "Sign Out?", message: "Click on the 'Sign Out' button below to end your visit", preferredStyle: .alert)

    let signOut = UIAlertAction(title: "Sign Out", style: .destructive) { (UIAlertAction) in
        print ("Set Badge State to false")

        let badgeOut = self.badgeTable.filter(self.badgeNumber == badgeNumberInt!)
        let badgeOutUpdate = badgeOut.update(self.badgeIn <- false)

        try self.myData.run(badgeOutUpdate)
    }

    let cancel = UIAlertAction(title: "Cancel", style: .cancel)

    checkOut.addAction(signOut)
    checkOut.addAction(cancel)

    present (checkOut, animated: true, completion: nil)
}

如果我改变:

try self.myData.run(badgeOutUpdate)

try! self.myData.run(badgeOutUpdate)

代码运行并完全符合我的预期。

任何可以向像我这样的白痴解释的文件的解释或指针将不胜感激!

标签: iosswiftuialertcontroller

解决方案


您正在调用的run方法可能会引发异常,但警报操作闭包不会引发异常。您必须处理异常,因为警报操作未设置为允许异常冒泡。当您添加 ! 在尝试中,您是在说“执行此操作,如果发生异常,则使应用程序崩溃”。另一种选择是将其包装在 do-catch 块中:

do {
    try self.myData.run(badgeOutUpdate)
} catch {
    // Handle the exception here
}

如果遇到异常,它将执行 catch 块。如果没有,捕获将被忽略。另一种选择是使用以下内容:

try? self.myData.run(badgeOutUpdate)

这将执行可以抛出的调用。如果该调用确实引发了异常,它会静默失败,您的程序会继续运行。在某些情况下这可能没问题,或者这可能意味着您的程序中没有其他任何东西可以工作。

每种情况都不同,选择最适合您的情况:异常崩溃、处理异常、静默失败。

Swift 文档很好地涵盖了这一点:https ://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html


推荐阅读