Swift数组按Index参数排序时将无Index元素前置的实现方法
排序逻辑正确实现方案
原有代码问题
你之前写的排序闭包{ $0.Index ?? 0 <= $1.Index ?? 1 }存在逻辑缺陷:通过空合运算符给nil值硬塞兜底数值,会让无Index属性的元素和Index值等于兜底值的元素排序权重混乱,最终导致无Index元素被排到队尾。
实现逻辑
排序时优先判断Index属性是否为空,规则如下:
- 无
Index属性的元素优先级最高,统一排在数组最前端 - 同时存在
Index属性的元素,直接按Index数值升序排列 - 两个元素都无
Index属性时,保持原有相对顺序即可
可直接运行的代码
let elements = content.sorted { pre, next in switch (pre.Index, next.Index) { case (nil, nil): return false case (nil, _): return true case (_, nil): return false case let (preIdx?, nextIdx?): return preIdx < nextIdx } }
用给出的示例数组验证:
- 无Index的
banana.png会被固定在最前端 - 剩余带Index的元素按值排序:
pear.png(0)<orange.png(1)<apple.png(2)
最终输出正好是预期的[ banana.png, pear.png, orange.png, apple.png ]
内容的提问来源于stack exchange,提问作者ldo1985
相关产品推荐
相关产品推荐

