Swift 4,同时访问元组成员

时间:2017-08-08 04:12:46

标签: swift

为什么我会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 --versionApple Swift version 4.0 (swiftlang-900.0.52 clang-900.0.29) Target: x86_64-apple-macosx10.9 enter image description here

1 个答案:

答案 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甚至编译时,情况已完全改变。独家访问问题现在被提前了。