3

在闭包中,我们可以以某种方式在内部使用相同的名称以及闭包捕获的值。

func load(withResource resource: Resource) {
    var data: A?
    var error: Error?

    load(resource: resource) { (result, error) in
        data = result // Ok!
        error = error // error!
    }

    print("data: \(data), error: \(error)")
}

我在想self如果我们在谈论存储属性时是否有类似使用的东西,但是这些变量是在函数范围内声明的。

最简单的方法就是重命名error,但我想知道是否还有其他方法。

4

1 回答 1

3

首先,如果您的加载方法是异步的,则错误和数据在打印时将始终为零。

您的问题的直接答案是,在闭包的范围内,“错误”的值是参数的值,无法从函数中访问错误。

显然有很多选择可以解决这个问题,但一个干净的选择是将您的信息变成一个元组:

func load(withResource resource: Resource) {

    var closureData: (data: A?, error: Error?)?

    load(resource: resource) { (result, error) in
       closureData = (result, error)
    }

    //print(closureData) if you don't need to format it)
    print("data: \(closureData.data), error: \(closureData.error)")
}
于 2016-12-08T20:45:41.823 回答