【发布时间】:2018-09-15 07:18:48
【问题描述】:
我实现了以下函数 - 作为布尔数组的扩展 - 这可能会引发 CustomError 错误:
enum CustomError: Error {
case empty
case doesNotContainTrue
}
extension Array where Element == Bool {
func indexOfFirstTrue() throws -> Int {
if isEmpty { throw CustomError.empty }
guard let detectedIndex = index(of: true) else {
throw CustomError.doesNotContainTrue
}
return detectedIndex
}
}
按预期工作:
let myArray = [false, true, false, true]
try print(myArray.indexOfFirstTrue()) // 1
接下来,我尝试将函数声明为:
func handleResult(_ index: Int) throws {
print(index * 2)
// ...
}
它应该获取myArray.indexOfFirstTrue() 的结果并对其进行处理(为简单起见,我们假设它打印乘以 2 的值):
try handleResult(myArray.indexOfFirstTrue()) // 2
我想做的是将handleResult声明为重新抛出函数:
可以使用 rethrows 关键字声明函数或方法 表明它仅在其功能之一时引发错误 参数抛出错误。这些功能和方法被称为 重新抛出函数和重新抛出方法。重新抛出函数和 方法必须至少有一个抛出函数参数。
The Swift Programming Language (Swift 4.1): Declarations - Rethrowing Functions and Methods.
所以我可以用非抛出公式调用它,因此它不会抛出错误:
handleResult(myArray.indexOfFirstTrue()) // 2
但我不知道应该编辑什么才能让它成为一个重新抛出的函数,所以我试图将它声明为:
func handleResult(_ index: Int) rethrows {
print(index * 2)
}
我得到了以下错误:
错误:'rethrows' 函数必须接受一个 throwing 函数参数
因此,我也尝试将其声明为:
func handleResult(_ index: (() throws -> Int)) rethrows {
print(index * 2)
}
显然得到了以下错误:
错误:无法将“Int”类型的值转换为预期的参数类型 '() 抛出 -> Int'
此时我该怎么办?
【问题讨论】:
-
为什么
handleResult要重新抛出?据我所知,您只希望indexOfFirstTrue抛出。您仍然可以将其称为try handleResult(myArray.indexOfFirstTrue())。 -
无关,但您获取
detectedIndex的逻辑可以简化为guard let detectedIndex = index(of: true) else { throw CustomError.doesNotContainTrue }。 -
感谢@Hamish 的留言 :)