为什么我得到 同时访问 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 传递 Tuple 成员?
swift --version
是 Apple Swift 版本 4.0 (swiftlang-900.0.52 clang-900.0.29)
目标:x86_64-apple-macosx10.9
最佳答案
同时访问是一个新的 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 情况在 beta 5 中完全改变了,测试代码甚至无法编译;独占访问问题现在已被解决。
关于Swift 4,同时访问元组成员作为 inout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45559168/