我遇到了从转义关闭中存储值的问题。
基本上我有一个带有转义的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不能隐式捕获变异的自我参数”错误
我需要存储结果值,但我不能。我该如何解决这个问题?
答案 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
self
是foo
struct的新实例。修改这个新实例没有任何意义,因为你作为这个结构的使用者永远不会得到这个新实例
它适用于类,因为它们通过引用进行复制。这意味着self.value = result
self
与之前的实例相同。