繁体   English   中英

UIAlert无法将类型'(_)throws->()'的值转换为预期的参数类型'(((UIAlertAction)-> Void)?

[英]UIAlert Cannot convert value of type '(_) throws -> ()' to expected argument type '((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)

该代码将运行,并且完全符合我的期望。

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

您正在调用的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

您需要do-catch

do {
      try self.myData.run(badgeOutUpdate)
  }
catch {
       print(error)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM