我正在使用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
}

09-05 02:29