我实现了以下函数 - 作为布尔数组的扩展 - 可能会抛出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关键字to声明函数或方法 表示只有在其功能之一时它才会抛出错误 参数抛出错误。这些功能和方法称为 重新抛出功能和重新抛出方法。重新定义函数和 方法必须至少有一个抛出函数参数。
<子> 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'函数必须采用抛出函数参数
func handleResult(_ index: (() throws -> Int)) rethrows {
print(index * 2)
}
显然有错误:
错误:无法将“Int”类型的值转换为预期的参数类型 '()抛出 - &gt; INT'
此时我该怎么做?
答案 0 :(得分:1)
请记住,参数类型为$test = (Get-Process -Name Win*).ProcessName
Start-Job -ArgumentList $test -ScriptBlock {
(New-Object -COM Wscript.Shell).Popup(($args[0] -join "`r`n"), 0, "Title", "48")
} | Out-Null
write-host "rest of script..."
!所以你需要调用传入的函数来获得结果!你还需要() -> Int
,因为函数可以抛出。
try
现在您可以像这样使用它:
func handleResult(_ index: (() throws -> Int)) rethrows {
print(try index() * 2) // see the "()"?
}