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
相关产品推荐
相关产品推荐

