【发布时间】:2017-02-04 02:13:37
【问题描述】:
有没有办法让for .. in 循环返回集合条目的references 而不是copies?
假设我有一个CGPoint 对象的数组points,我想循环它们并将每个点传递给一个函数adjustPoint,该函数可以使用inout 参数修改该点。
现在执行以下操作不起作用,因为 for .. in 循环将点返回为不可变/可变(取决于我是否使用 var)副本中的实际点数组:
for var point in points {
adjustPoint(point: &point) // This function only changes the copy
}
目前,我认为这样做的唯一方法是遍历索引:
for i in 0..<points.count {
adjustPoint(point: &points[i])
}
这真的是唯一的方法还是for .. in 循环也有可能?
注意:我已经阅读了很久以前的这个问题(我相信是 Swift 1)所以我想他们可能在此期间改变了一些东西:turn for in loops local variables into mutable variables
【问题讨论】:
-
也许您可以尝试将它们包装在一个类中。
-
为什么不使用地图?您将创建副本,但
points = points.map { adjustPoint(point: $0) }会成功。 -
是的,我想函数式方法是下一个最好的选择,并且可以保持干净,但我仍然不喜欢 Swift 让正确使用引用变得如此烦人的事实,相反,你拥有一切这些“一次性使用的一次性”可变副本随处可见。不过,这可能只是个人喜好......
-
@jjatie 另外,如果我不想更新所有内容,只更新最后 n 个条目。有没有办法使用地图来做到这一点?
-
我认为这里对 Swift Arrays 存在误解。你从来没有真正修改过一个 Swift 数组,就像你在向它添加 1 时修改数字 4 一样。 Array 的每次修改都会创建一个新的 Array(就像将 1 加到 4 会创建一个新的 Int)。在某些情况下,编译器可能能够使新副本非常便宜(通过证明没有人可以看到旧副本,因此只需在适当的位置改变旧副本),但从逻辑上讲,在许多情况下实际上,Array after赋值是一种与之前完全不同的数据结构。所以不能引用单个元素。
标签: swift for-loop pass-by-reference