Swift中按名称字母与计数实现多条件排序失败求助
Swift数组多条件排序的正确实现
你的代码问题出在元组比较的逻辑上,错误地将两个元素的name属性交叉比较,导致name的排序规则失效。以下是两种正确的多条件排序实现方案,假设你需要先按count降序排列,count相同时按name升序排列:
方案一:分步判断(直观易懂)
通过显式判断count是否相等,分别处理主、次排序条件:
let sortedArray = array.sorted { if $0.count != $1.count { // 主条件:count降序 return $0.count > $1.count } else { // 次条件:count相同时,name升序 return $0.name < $1.name } }
方案二:元组比较(简洁写法)
利用Swift元组的逐元素比较特性,将count取反实现降序逻辑,再搭配name升序构造元组:
let sortedArray = array.sorted(by: { (-$0.count, $0.name) < (-$1.count, $1.name) })
排序结果验证
针对你提供的示例数据,两种方案的排序结果一致:
Variant(name: "Bc", count: 55), Variant(name: "Bd", count: 45), Variant(name: "Ab", count: 12), Variant(name: "Ac", count: 10), Variant(name: "Ad", count: 8), Variant(name: "Ae", count: 0)
原代码错误分析
你之前的写法($0.count ?? 0, $1.name) > ($1.count ?? 0, $0.name)存在两个问题:
- 元组的第二个元素交叉使用了
$1.name和$0.name,导致name的比较逻辑完全混乱; - 即使
count相等,也无法实现name的正确排序,因为比较的是两个元素name的反向关系。
内容的提问来源于stack exchange,提问作者Vadim
相关产品推荐
相关产品推荐

