为什么我会Simultaneous accesses to 0x108ce0000
?
func swapInts(_ a: inout Int, _ b: inout Int) {
let temp = a;
a = b;
b = temp;
}
var Ints = (first:2, second:3);
swapInts(&Ints.first, &Ints.second);
print(Ints);
如何在swift中通过inout / reference传递元组成员?
swift --version
是Apple Swift version 4.0 (swiftlang-900.0.52 clang-900.0.29)
Target: x86_64-apple-macosx10.9
答案 0 :(得分:2)
同时访问是一个新的Swift 4问题。观看正在实施的独占访问的WWDC视频讨论。 (或阅读关于swift-evolution的proposal。)
独占访问规则可以阻止您完全做您正在尝试做的事情。您不能使用inout
来访问诸如数组的多个元素,结构及其属性之类的东西,或者(如您所发现的)元组的元素 - 因为结果可能是不连贯的。
因此,这是合法的:
var Ints = (first:2, second:3);
var i = 4
swapInts(&Ints.first, &i);
但你所拥有的不是:
var Ints = (first:2, second:3);
swapInts(&Ints.first, &Ints.second);
但这种情况很简单;没有必要将元组inout
的两个元素都传递给任何东西。如果你只想交换元素,为什么不直接说
(Ints.first, Ints.second) = (Ints.second, Ints.first)
编辑但问题只能在命令行上重现,而不能在iOS项目中重现,正如Martin R在评论中指出的那样,这似乎不是一个案例完全同时访问。我已经提交了一份错误报告。
EDIT2 我的错误报告又回来了,因为它不是一个错误。全局元组实际上 与本地元组不同。
EDIT3 在测试代码5甚至编译时,情况已完全改变。独家访问问题现在被提前了。