我实现了以下函数 - 作为布尔数组的扩展 - 这可能会引发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 关键字声明函数或方法,以指示仅当其函数参数之一引发错误时才引发错误。这些函数和方法称为重新抛出函数和重新抛出方法。重新抛出函数和方法必须至少有一个抛出函数参数。
所以我可以用非抛出公式调用它,因此它不会抛出错误:
handleResult(myArray.indexOfFirstTrue()) // 2
但是我不知道应该编辑什么才能让它成为一个重新抛出的函数,所以我试图将它声明为:
func handleResult(_ index: Int) rethrows {
print(index * 2)
}
我得到了以下错误:
错误:“重新抛出”函数必须采用抛出函数参数
因此,我也尝试将其声明为:
func handleResult(_ index: (() throws -> Int)) rethrows {
print(index * 2)
}
显然得到了以下错误:
错误:无法将“Int”类型的值转换为预期的参数类型“() throws -> Int”
此时我该怎么办?