具有相同名称的Swift捕获值

时间:2016-12-08 19:58:20

标签: swift closures captured-variable

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

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,但我想知道是否还有其他办法。

1 个答案:

答案 0 :(得分:3)

首先,如果你的加载方法是异步的,那么在打印时错误和数据总是为零。

对你的问题的直接回答是,在闭包范围内,“error”的值是参数的值,并且无法从函数中访问错误。

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

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)")
}