You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中多条件排序后布尔值优先级排序的实现问题咨询

解决Swift中布尔值的自定义排序问题

我来帮你搞定这个布尔值排序的问题!你遇到的核心问题是在三个属性(country、grade、condition)都相等的情况下,布尔值的比较逻辑写反了或者没处理到位。Swift里Bool类型的比较规则是true > false,只要调整这部分的逻辑,就能让marbling为true的元素排在前面。

修改你的排序函数

把排序闭包中布尔值比较的注释部分替换成以下逻辑即可:

func sortBythree() {
    let sortedBeef = beefs.sorted { left, right in
        if left.country == right.country {
            if left.grade == right.grade {
                if left.condition == right.condition {
                    // 让marbling为true的元素排在前面
                    return left.marbling > right.marbling
                }
                return left.condition > right.condition
            }
            return left.grade < right.grade
        }
        return left.country < right.country
    }
    for beef in sortedBeef {
        print(beef.country, beef.grade, beef.condition, beef.marbling)
    }
}

为什么这样有效?

Swift的Bool类型遵循Comparable协议,默认的比较规则是true的优先级高于false——也就是true > false会返回true。当left.marbling是true而right.marbling是false时,left.marbling > right.marbling返回true,意味着left会被排在right前面,完全符合你的需求。

如果你觉得直接用大于号不够直观,也可以换成更语义化的写法,效果是一样的:

// 等价写法:左边是true且右边是false时,左边排前面
return left.marbling && !right.marbling

修改后的运行结果

执行修改后的函数,你会得到符合预期的排序结果:

id A frozen false
id C fresh false
us A fresh true
us B frozen true
au A fresh true
au A fresh true
au A fresh false

可以看到,au A fresh分组里,两个marbling: true的元素已经排在了false的前面。

内容的提问来源于stack exchange,提问作者Dimas Pagam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:18:11