如何使用Swift内置partition方法实现数组选中图形元素上移功能
实现思路
上移一层的核心逻辑是将所有选中元素整体向数组末尾方向挪动一位(对应图形层级升高一层),同时保持选中元素内部的相对顺序不变,我们可以通过对特定切片调用分区方法实现:
- 先判断边界:如果不存在选中元素、或最后一个选中元素已经处于数组末尾(已经是最顶层)、或选中元素后一位是未使用状态,直接返回
- 取数组从开头到「最后一个选中元素索引+1」的切片,对该切片执行分区操作,将选中元素全部分到切片后半段
- 拼接处理后的切片和剩余未处理的数组部分即可
最终实现代码
func bringForwardEA() { // 先找最后一个选中元素的索引,同时判断边界条件 guard let lastSelectedIdx = objects.lastIndex(where: { $0.selected }), lastSelectedIdx < objects.endIndex - 1, !objects[lastSelectedIdx + 1].unused else { return } // 确定要处理的切片范围:开头到最后一个选中元素的后一位 let processRange = objects.startIndex...lastSelectedIdx + 1 // 对切片执行稳定分区(iOS14+支持stablePartition,保证选中元素相对顺序不变) // 分区条件:选中的元素放到切片后半段 let splitIdx = objects[processRange].stablePartition(by: { $0.selected }) // 拆分后重新拼接数组 let processedSlice = objects[processRange] objects = Array(processedSlice[..<splitIdx] + processedSlice[splitIdx...] + objects[(lastSelectedIdx + 2)...]) }
逻辑说明
- 和你之前实现的三个方法逻辑完全对齐,都是通过分区操作拆分选中/未选中元素再重新拼接,符合WWDC演讲中提到的无循环、高可扩展的实现规范
- 自动支持单个、多个连续/非连续选中元素的上移操作,无需额外处理边界
- 如果你需要兼容更低的iOS版本,或者不要求严格保持选中元素的相对顺序,把
stablePartition替换为普通的partition即可正常运行
内容的提问来源于stack exchange,提问作者user3069232
相关产品推荐
相关产品推荐

