Swift数组移动函数的行为与你预期的不一样-为什么?

yv5phkfx  于 2023-08-02  发布在  Swift
关注(0)|答案(3)|浏览(111)

最近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一样,不是吗?
请帮助我理解。

swvgeqrz

swvgeqrz1#

我花了一些时间制作ASCII艺术图,所以不要浪费时间。
从概念上讲,我认为它是:

  • 索引指向实际元素
  • offset是从阵列的开始移动的空格数;基本上指向元件之间差距

因此,算法是:

  • 获取指定索引处的项
  • 确定目标偏移量(基于阵列的现状)
  • 将该项目移动到该偏移中

因此,对于您的用例:

["a", "b", "c", "d"]: moving from index 2 to offset 1: ["a", "c", "b", "d"]

|a|b|c|d| |a|b|c|d|
     v      ^
     |      |
     +------+

["a", "b", "c", "d"]: moving from index 1 to offset 2: ["a", "b", "c", "d"]

|a|b|c|d| |a|b|c|d|
   v          ^
   |          |
   +----------+

["a", "b", "c", "d"]: moving from index 2 to offset 2: ["a", "b", "c", "d"]

|a|b|c|d| |a|b|c|d|
     v        ^
     |        |
     +--------+

字符串
正如您所看到的,指定一个偏移量,使元素与其自身相邻,不会导致数组发生明显的变化。

q5iwbnjs

q5iwbnjs2#

我对move操作的理解是:
将指定偏移量处的所有元素移动到指定的目标偏移量,并保留顺序。
移动到just before destination,所以你得到的结果是正确的。

8fsztsew

8fsztsew3#

谢谢你所有伟大的解释。我遇到了同样的问题,然后用.swapAt代替。这正是我交换数组中两个元素的位置所需要的:https://developer.apple.com/documentation/swift/array/swapat(::)

相关问题