Swift 4,同时访问元组成员作为 inout

标签 swift

为什么我得到 同时访问 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 --versionApple Swift 版本 4.0 (swiftlang-900.0.52 clang-900.0.29) 目标:x86_64-apple-macosx10.9 enter image description here

最佳答案

同时访问是一个新的 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/

相关文章:

ios - 使用 Objective-C 和 Swift 中的 Parse 在设备离线时执行方法

iphone - 在 Swift 中以编程方式将类添加到 UIbutton

swift - Swift 中不再有 `private init` 了吗?

ios - UIImageView 旋转动画时的奇怪行为

ios - swift : Map function found nil while unwrapping an Optional value

java - 从网站本地化手机(获取经度和纬度)的最佳方法是什么?

ios - SVProgressHUD 没有显示在屏幕中央?

ios - 执行函数 iOS -- 无法将数据传递给不同的 ViewController

swift - 从自定义相机获取深度数据

python - 用于手机的远程蓝牙摄像头触发器