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 })
额外优化建议
- 避免用字符串存储日期/年份:字符串比较容易因格式问题出错,建议把
date字段改成Date类型,年份可以通过Calendar从Date中动态获取,这样排序更准确也更符合Swift的类型规范。 - 统一日期格式:如果暂时无法修改字段类型,务必确保所有
date字符串都采用yyyy-MM-dd这种可直接按字典序比较的格式,否则会出现“12/01/2017”排在“01/01/2018”前面的错误。
这样调整后,就能完美实现你需要的排序规则:2017年条目在前、2018年在后,同一年份内按日期排序,日期相同则按ID排序。
内容的提问来源于stack exchange,提问作者kingkps
相关产品推荐
相关产品推荐

