我正在使用 DEVELOPMENT-SNAPSHOT-2016-06-06-a
Swift的版本。我似乎无法绕过这个问题,我尝试过使用 @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
如果你想了解更多关于原因, 这是负责任的Swift提案。
新的调度API使得 sync
方法 @noreturn
所以你不需要显式捕获:
connectQueue.sync {
test = 20
}
你提到最近的一个,你使用的是Swift3 dev snapshot
的 Swift
。请尝试以下操作,让我知道它是否有效:
public struct ExampleStruct {
let connectQueue = DispatchQueue(label: "connectQueue", attributes: .concurrent)//This creates a concurrent Queue
var test = 10
mutating func example() {
connectQueue.sync {
self.test = 20
}
}
}
如果您对其他类型的队列感兴趣,请检查以下内容:
let serialQueue = DispatchQueue(label: "YOUR_QUEUE", attributes: .serial)
serialQueue.sync {
//
}
得到 mainQueue
异步和同步:
DispatchQueue.main.async {
//async operations
}
DispatchQueue.main.sync {
//sync operations
}
如果你对背景感兴趣:
DispatchQueue.global(attributes: .qosDefault).async {
//async operations
}
您可以在Swift3中引用此功能以及更改现有版本: 从Swift 2.2迁移到Swift 2.3或Swift 3