Swift 字典数组多条件排序:优先按sequence,相同值按name排序
多条件排序实现方案
直接在现有sorted方法的闭包内,按优先级分层编写比较逻辑即可,无需拆分多次排序,核心代码如下:
self.currArray = currArray.sorted { lhs, rhs in // 第一优先级:按sequence字段升序排序 if lhs.sequence != rhs.sequence { return lhs.sequence < rhs.sequence } // 第二优先级:sequence值相等时,按name字段的字典序升序排列 return lhs.name < rhs.name }
逻辑说明
- 你之前的排序逻辑因为只判断了sequence字段,当两个元素的sequence值相等时,sorted闭包没有可返回的比较结果,会默认保留元素在原数组中的相对顺序,所以才出现同sequence元素未按name排序的情况
- 新的闭包内的判断严格按优先级从高到低执行,只要两个元素的sequence值不相等,就直接返回sequence的比较结果,不会触发后续的name比较逻辑
- 只有当两个元素的sequence值完全匹配时,才会进入name字段的比较环节,对同sequence的元素做二次排序
- 对照你提供的示例数据,sequence为0的两个元素中,
TABLET的字典序位置早于TELEFON,排序完成后这两个元素的顺序就会变为TABLET在前、TELEFON在后,完全符合预期
特殊场景适配
如果name字段包含非通用拉丁字符(比如示例中的土耳其语变音字符İ、Ş等),直接使用<做字符串比较会按Unicode编码顺序排序,若需要匹配对应语言的字母表排序规则,可以将name的比较逻辑替换为本地化比较:
// 替换原name比较的行 return lhs.name.localizedCompare(rhs.name) == .orderedAscending
内容的提问来源于stack exchange,提问作者uyarc
相关产品推荐
相关产品推荐

