假設我們有能力自我突變的結構有發生作爲後臺操作的一部分:自我變異在後臺線程斯威夫特結構
struct Thing {
var something = 0
mutating func operation(block:() -> Void) {
// Start some background operation
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
// Mutate self upon background task completion
self.something += 1
block()
}
}
}
現在,當我在上下文中使用這樣的結構:
var myThing = Thing()
myThing.operation {
println(myThing.something)
}
的println
給我0
,彷彿myThing
從來沒有發生突變。從dispatch_async
內部打印self.something
明顯產生1
。
我該如何解決此問題,最好不必在operation
競爭區塊中傳遞更新結構的self
,並覆蓋主環境中的原始變量?
// Ew
var myThing = Thing()
myThing.operation {
(mutatedThing) in
myThing = mutatedThing
println(myThing.something)
}
是的,我也得出這樣的結論:我完全濫用結構和做錯怪事。感謝您對此做出詳細的解釋。後人:http://faq.sealedabstract.com/structs_or_classes/ – Arnold