Swift Array的move方法表现不符合预期,是什么原因导致的?
Swift Array move方法运行异常原因解答
首先明确Array.move(fromOffsets:toOffset:)的设计完全对齐SwiftUI列表拖拽的交互逻辑,核心语义如下:
fromOffsets是要移动的元素在原始数组中的索引集合toOffset的含义是:将选中的元素插入到原始数组中索引为toOffset的元素的前面;如果toOffset等于数组长度,就插入到数组末尾。
你的测试案例解释
我们按照上述语义逐一对应你的测试场景:
测试1:fromOffsets=2,toOffset=1
原始数组:["a", "b", "c", "d"]
要把索引2的元素c,放到原始数组索引1的元素b的前面,最终结果就是["a", "c", "b", "d"],和你的运行结果一致。
测试2:fromOffsets=1,toOffset=2
原始数组:["a", "b", "c", "d"]
你指定toOffset=2,含义是把索引1的元素b放到原始数组索引2的元素c的前面。而b本来就在c的前面,所以操作不会对数组产生任何修改,这就是你看到结果没有变化的核心原因。
如果你想要实现「把索引1的b移到c的后面」的效果,需要把toOffset设为3(也就是放到原始数组索引3的元素d的前面),修改后的代码运行结果就是你预期的["a", "c", "b", "d"]。
测试3:fromOffsets=2,toOffset=2
含义是把索引2的元素c放到它自己的前面,自然不会产生任何变化,符合运行结果。
补充说明
这个方法的参数设计是为了直接承接SwiftUI中onMove modifier的回调参数,你在SwiftUI列表拖拽时拿到的toOffset参数天然符合上面的语义,不需要额外转换就可以直接传给move方法使用。
内容的提问来源于stack exchange,提问作者Saviz
相关产品推荐
相关产品推荐

