Swift 数组移动函数的行为与您期望的不同 - 为什么?

Sav*_*viz 14 arrays swift swiftui

最近 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)")
Run Code Online (Sandbox Code Playgroud)

结果是:

after 2 -> 1 ["a", "c", "b", "d"]

after 1 -> 2 ["a", "b", "c", "d"]

after 2 -> 2 ["a", "b", "c", "d"]
Run Code Online (Sandbox Code Playgroud)

我对 1->2 结果感到非常困惑...这怎么不改变数组!它应该与 2->1 相同,不是吗?

请帮助我理解。

msb*_*bit 9

我花了一些时间制作 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        ^
     |        |
     +--------+
Run Code Online (Sandbox Code Playgroud)

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


wor*_*dog 4

我对move操作的理解是:

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

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

  • 我想知道,为什么苹果不引入像“move(fromIndex, toIndex)”这样的东西?为什么我们需要“IndexSet”? (3认同)