如何实现自定义对象数组按date优先、同日期按subject排序?
Swift 自定义对象数组的组合条件排序(先按Date,再按Subject)
嘿,我发现你当前的排序逻辑没完全实现你想要的组合需求——它现在是有Date就优先按Date排,只有当Date都不存在时才会用Subject,而不是「Date相同的时候再用Subject做二次排序」。我来帮你调整代码,完美达成你的要求!
核心思路
组合排序的关键是:先处理第一优先级的Date字段,只有当Date相等(或处理完Date的nil情况)时,再去比较第二优先级的Subject字段。我们把这个逻辑拆成两步走,就能实现你要的效果。
修正后的代码
let result = results.sorted { customObject1, customObject2 in // 第一步:处理Date的比较逻辑 let dateCompareResult: ComparisonResult? if let date1 = customObject1.date as Date?, let date2 = customObject2.date as Date? { // 两个对象都有Date,直接比较 dateCompareResult = date1.compare(date2) } else if customObject1.date != nil { // 只有第一个对象有Date,默认让它排在前面(可根据需求调整) dateCompareResult = .orderedAscending } else if customObject2.date != nil { // 只有第二个对象有Date,让第一个排在后面 dateCompareResult = .orderedDescending } else { // 两个都没有Date,跳过Date比较,直接走Subject逻辑 dateCompareResult = nil } // 判断是否需要进入Subject排序 if let dateResult = dateCompareResult { if dateResult != .orderedSame { // Date不相等,直接返回Date的排序结果(这里是你要的降序,大Date在前) return dateResult == .orderedDescending } // Date相等,继续比较Subject } // 第二步:处理Subject的比较逻辑 if let subject1 = customObject1.subject, let subject2 = customObject2.subject { // 两个都有Subject,忽略大小写升序排序 return subject1.localizedCaseInsensitiveCompare(subject2) == .orderedAscending } else if customObject1.subject != nil { // 只有第一个有Subject,让它排在前面 return true } else { // 第二个有Subject或两者都没有,返回false return false } }
逻辑说明
- Date优先级处理:
- 优先比较两个对象的Date,若Date不相等,直接用Date的排序结果返回(保持你要的降序规则)
- 针对Date为nil的情况,默认把有Date的对象排在前面,你可以根据自己的业务需求调整这个规则
- Subject二次排序:
- 只有当Date相等(或两个对象都没有Date)时,才会触发Subject的比较
- 同样处理了Subject为nil的情况,默认把有Subject的对象排在前面,同时支持忽略大小写的升序排序
示例验证
假设你有这些自定义对象:
- 对象B:date=2024-06-01,subject="Apple"
- 对象A:date=2024-06-01,subject="Banana"
- 对象C:date=2024-05-30,subject="Cherry"
- 对象D:date=nil,subject="Date"
排序后的结果会是:B → A → C → D,完全符合「先按Date降序,Date相同则按Subject升序」的要求。
内容的提问来源于stack exchange,提问作者Hemang
相关产品推荐
相关产品推荐

