我正在使用Swift的DEVELOPMENT-SNAPSHOT-2016-06-06-a
版本。我似乎无法解决这个问题,我已经尝试在各个地方使用@noescape
,但是仍然出现以下错误:
为了更好地说明,这是一个简单的示例:
public struct ExampleStruct {
let connectQueue = dispatch_queue_create("connectQueue", nil)
var test = 10
mutating func example() {
if let connectQueue = self.connectQueue {
dispatch_sync(connectQueue) {
self.test = 20 // error happens here
}
}
}
}
这些Swift二进制文件中的某些内容必须已经更改,这现在导致我之前的工作代码损坏了。我要避免的一种解决方法是使我的struct成为类,这确实有助于解决问题。让我知道是否还有另一种方法。
最佳答案
我无法测试它,因为我没有使用带有该错误的构建,但是我很确定通过显式捕获自我可以解决此问题:
dispatch_sync(connectQueue) { [self] in
self.test = 20
}
编辑:显然它不起作用,也许您可以尝试一下(不是很好的tbh):
var copy = self
dispatch_sync(connectQueue) {
copy.test = 20
}
self = copy
如果您想了解更多有关原因的信息,请here is the responsible Swift proposal。
新的调度API使
sync
方法为@noreturn
,因此您不需要显式捕获:connectQueue.sync {
test = 20
}