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)
代码 运行 完全符合我的预期。
任何可以向像我这样的白痴解释它的文档的解释或指针将不胜感激!
你需要do-catch
块
do {
try self.myData.run(badgeOutUpdate)
}
catch {
print(error)
}
您正在调用的 run
方法可以抛出异常,但警告操作闭包不希望抛出异常。您必须处理异常,因为警报操作未设置为允许异常冒泡。当你添加!尝试一下,你说 "do this and if an exception happens, crash the app." 另一种选择是将它包装在一个 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
我一直在寻找 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)
代码 运行 完全符合我的预期。
任何可以向像我这样的白痴解释它的文档的解释或指针将不胜感激!
你需要do-catch
块
do {
try self.myData.run(badgeOutUpdate)
}
catch {
print(error)
}
您正在调用的 run
方法可以抛出异常,但警告操作闭包不希望抛出异常。您必须处理异常,因为警报操作未设置为允许异常冒泡。当你添加!尝试一下,你说 "do this and if an exception happens, crash the app." 另一种选择是将它包装在一个 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