逃避关闭存储价值

时间:2016-11-20 04:02:41

标签: escaping closures swift3

我遇到了从转义关闭中存储值的问题。

基本上我有一个带有转义的completionHandler的get请求函数。签名如下所示:

struct NetworkRequest {

   func getRequest(completionHandler: @escaping (_ result: [String)]?) -> Void) {
   // implementations
   }
}

现在我有一个调用此方法的结构。像这样:

struct foo {

   var value: [String]?
   lazy var networkRequest = NetworkRequest()

   func testGet() {
      networkRequest.getRequest((result) {
         self.value = result  // here's my issue
      }
   }
}

我得到这个“Closure不能隐式捕获变异的自我参数”错误

我需要存储结果值,但我不能。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在Swift 3中无法使用结构体来实现的行为。 我建议让foo成为一个类而不是结构 如果使用struct对您来说并不重要,那么这将有效。

这是更新的代码:

struct NetworkRequest {

    func getRequest(completionHandler: @escaping ([String]?) -> Void) {
        // implementations
    }
}

class foo {

    var value: [String]?
    lazy var networkRequest = NetworkRequest()

    func testGet() {
        networkRequest.getRequest { result in
            self.value = result
        }
    }
}

您的代码无法遵守的原因是结构的copy by value性质:
在您的示例中getRequest@escaping闭包completionHandler和struct foo尝试在此闭包实现中修改自身。但是为了确保self在调用completionHandler时存在,编译器需要复制self。结构copy表示创建新实例。这意味着self.value = result selffoo struct的新实例。修改这个新实例没有任何意义,因为你作为这个结构的使用者永远不会得到这个新实例 它适用于类,因为它们通过引用进行复制。这意味着self.value = result self与之前的实例相同。