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

如何实现自定义对象数组按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
    }
}

逻辑说明

  1. Date优先级处理:
    • 优先比较两个对象的Date,若Date不相等,直接用Date的排序结果返回(保持你要的降序规则)
    • 针对Date为nil的情况,默认把有Date的对象排在前面,你可以根据自己的业务需求调整这个规则
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:08:04