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

Swift 4:按三个条件对数组排序的问题求助

解决TableView条目跨年份排序混乱的问题

你现在的核心问题出在两次独立调用sort方法上——第一次按日期和ID排序后,第二次单独按年份排序会完全打乱之前的排序结果,不仅同一年份内的日期顺序变得混乱,甚至可能因为字符串比较的细节导致年份展示顺序不符合预期。

问题拆解

当前代码先对数组执行了一次按日期/ID的排序,紧接着又执行了一次按年份的排序,这相当于只保留了最后一次排序的结果,之前的日期排序逻辑完全失效了。另外,如果你的date字符串不是yyyy-MM-dd这种可直接按字典序比较的格式(比如是MM/dd/yyyy),直接比较字符串也会出现日期排序错误的情况。

优化后的解决方案

把所有排序条件合并到一个排序闭包里,按照你需要的优先级依次判断:先按年份排序(确保2017年条目在前,2018年在后),同一年份内再按日期排序,日期相同则按ID排序。

调整后的排序代码

self.sortedTableArray.sort(by: { object1, object2 in
    // 1. 优先比较年份
    if object1.year != object2.year {
        // 若年份是"2017"/"2018"这类完整格式,直接字符串比较即可
        // 如果是"17"/"18"短格式,建议转成Int比较:Int(object1.year)! < Int(object2.year)!
        return object1.year < object2.year
    }
    // 2. 年份相同,比较日期
    if object1.date != object2.date {
        // 重要提示:如果date不是"yyyy-MM-dd"格式,直接字符串比较会出错!
        // 推荐转成Date类型后比较,示例代码如下(需替换成你的日期格式):
        // let formatter = DateFormatter()
        // formatter.dateFormat = "yyyy-MM-dd" // 改成你实际使用的日期格式
        // guard let date1 = formatter.date(from: object1.date), let date2 = formatter.date(from: object2.date) else {
        //     return false
        // }
        // return date1 < date2
        return object1.date < object2.date
    }
    // 3. 日期相同,比较ID
    return object1.id < object2.id
})

额外优化建议

  1. 避免用字符串存储日期/年份:字符串比较容易因格式问题出错,建议把date字段改成Date类型,年份可以通过Calendar从Date中动态获取,这样排序更准确也更符合Swift的类型规范。
  2. 统一日期格式:如果暂时无法修改字段类型,务必确保所有date字符串都采用yyyy-MM-dd这种可直接按字典序比较的格式,否则会出现“12/01/2017”排在“01/01/2018”前面的错误。

这样调整后,就能完美实现你需要的排序规则:2017年条目在前、2018年在后,同一年份内按日期排序,日期相同则按ID排序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:27:10