【问题标题】:Swift array move function doesn't behave as you would expect - why?Swift 数组移动函数的行为与您预期的不同 - 为什么?
【发布时间】:2021-11-18 03:00:35
【问题描述】:

最近 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一样吧?

请帮助我理解。

【问题讨论】:

  • 似乎在第一次交换 b 和 c 时按预期工作。第二个将它们交换回来,第三个什么也不做。你在期待什么?
  • 查看 workingdgo 的回答。通过使用 0 而不是 1 来证明它对自己是正确的。偏移量最多可以是 4,而不是 3。
  • @loremipsum 我在所有移动操作之前重置为 a b c d ...我预计 1-> 2 和 2->1 是完全相同的最终结果。

标签: arrays swift swiftui


【解决方案1】:

我花了一些时间制作 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        ^
     |        |
     +--------+

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

【讨论】:

    【解决方案2】:

    我对@9​​87654321@操作的理解是:

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

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

    【讨论】:

    • 我认为我的理解中缺少的是 toOffset 不是 newIndex 并且该项目移动到“就在目的地之前”的事实。这就解释了。谢谢。
    猜你喜欢
    • 2023-02-04
    • 2013-11-14
    • 2016-09-04
    • 1970-01-01
    • 2012-09-20
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多