2

我实现了以下函数 - 作为布尔数组的扩展 - 这可能会引发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 关键字声明函数或方法,以指示仅当其函数参数之一引发错误时才引发错误。这些函数和方法称为重新抛出函数和重新抛出方法。重新抛出函数和方法必须至少有一个抛出函数参数。

Swift 编程语言 (Swift 4.1):声明 - 重新抛出函数和方法。

所以我可以用非抛出公式调用它,因此它不会抛出错误:

handleResult(myArray.indexOfFirstTrue()) // 2

但是我不知道应该编辑什么才能让它成为一个重新抛出的函数,所以我试图将它声明为:

func handleResult(_ index: Int) rethrows {
    print(index * 2)
}

我得到了以下错误:

错误:“重新抛出”函数必须采用抛出函数参数

因此,我也尝试将其声明为:

func handleResult(_ index: (() throws ->  Int)) rethrows {
    print(index * 2)
}

显然得到了以下错误:

错误:无法将“Int”类型的值转换为预期的参数类型“() throws -> Int”

此时我该怎么办?

4

1 回答 1

2

请记住,参数是 type () -> Int!所以需要调用传入的函数才能得到结果!你还需要try因为函数可以抛出。

func handleResult(_ index: (() throws ->  Int)) rethrows {
    print(try index() * 2) // see the "()"?
}

现在你可以像这样使用它:

let myArray = [true]
try handleResult(myArray.indexOfFirstTrue)
于 2018-04-05T12:54:57.990 回答