3

最近 Swift 有一个新的方法叫做 move for Arrays。我们可以使用它来配合 Swiftui 列表拖放列表移动。我的挑战是我不明白它是如何独立工作的,Apple 中的文档对此很少见。这是我在使用此功能时注意到的一种奇怪行为。

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 相同,不是吗?

请帮我理解。

4

2 回答 2

3

我花了一些时间制作 ASCII 艺术图,所以我们不要浪费时间。

从概念上讲,我认为它是:

  • index 指向实际元素
  • 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        ^
     |        |
     +--------+

如您所见,指定将元素放置在其自身附近的偏移量不会导致数组发生明显变化。

于 2021-09-25T00:45:11.483 回答
1

我对move操作的理解是:

将指定偏移量处的所有元素移动到指定目标偏移量,同时保留顺序。

移动是 to just before destination,所以你得到的结果是正确的。

于 2021-09-24T23:34:53.920 回答