如何申报重新抛出功能?

时间:2018-04-05 12:49:23

标签: swift rethrow

我实现了以下函数 - 作为布尔数组的扩展 - 可能会抛出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'

此时我该怎么做?

1 个答案:

答案 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 "()"?
}