最近Swift有一个新的方法叫做move for Arrays。我们可以使用它来配合Swiftui列表拖放列表移动。我的挑战是,我不明白它是如何独立工作的,苹果的文档很少。这是我在使用这个函数时注意到的一个奇怪的行为。
var array = ["a", "b" ,"c", "d"]
print("before \(array)\n")
array = ["a", "b" ,"c", "d"]
array.move(fromOffsets: IndexSet(integer: 2), toOffset: 1)
print("after 2 -> 1 \(array)")
array = ["a", "b" ,"c", "d"]
array.move(fromOffsets: IndexSet(integer: 1), toOffset: 2)
print("after 1 -> 2 \(array)")
array = ["a", "b" ,"c", "d"]
array.move(fromOffsets: IndexSet(integer: 2), toOffset: 2)
print("after 2 -> 2 \(array)")
字符串
结果如下:
after 2 -> 1 ["a", "c", "b", "d"]
after 1 -> 2 ["a", "b", "c", "d"]
after 2 -> 2 ["a", "b", "c", "d"]
型
我对1->2的结果感到非常困惑。那怎么会不改变数组呢!它应该和2->1一样,不是吗?
请帮助我理解。
3条答案
按热度按时间swvgeqrz1#
我花了一些时间制作ASCII艺术图,所以不要浪费时间。
从概念上讲,我认为它是:
因此,算法是:
因此,对于您的用例:
字符串
正如您所看到的,指定一个偏移量,使元素与其自身相邻,不会导致数组发生明显的变化。
q5iwbnjs2#
我对
move
操作的理解是:将指定偏移量处的所有元素移动到指定的目标偏移量,并保留顺序。
移动到
just before destination
,所以你得到的结果是正确的。8fsztsew3#
谢谢你所有伟大的解释。我遇到了同样的问题,然后用
.swapAt
代替。这正是我交换数组中两个元素的位置所需要的:https://developer.apple.com/documentation/swift/array/swapat(::)