Swift:基于Firebase dateField筛选排序articleArray为两类数组
Swift中Firebase数据按日期分组(7天内/剩余)
我来帮你梳理一下具体的实现步骤和代码示例,这样你就能轻松把Firebase返回的数据分成你需要的两组了:
1. 先搞定日期解析工具
Firebase返回的是dd MMM yy格式的日期字符串(比如"05 Oct 24"),咱们得先把它转成Swift能识别的Date类型,才能做比较。这里要注意设置正确的本地化,避免解析失败:
let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "dd MMM yy" formatter.locale = Locale(identifier: "en_US_POSIX") // 确保英文月份缩写能被正确解析 return formatter }()
2. 计算7天后的阈值日期
用Calendar来计算当前日期往后推7天的日期,这就是咱们分组的分界点:
// 获取当前日期并计算7天后的日期 guard let sevenDaysLater = Calendar.current.date(byAdding: .day, value: 7, to: Date()) else { // 理论上很少出现计算失败的情况,这里做个兜底处理 print("Failed to calculate seven days later date") return }
3. 处理Firebase数据并分组
假设你从Firebase拿到的是articleArray: [Article],其中Article模型包含dateField: String属性。咱们先过滤出能成功解析日期的条目,再分成两组:
// 先筛选出能正常解析日期的条目,同时带上解析后的Date对象 let validArticles = articleArray.compactMap { article -> (article: Article, date: Date)? in guard let date = dateFormatter.date(from: article.dateField) else { print("Invalid date format for article: \(article)") return nil } return (article, date) } // 将有效条目分成两组:7天内的 和 剩余的 let (upcomingArticles, pastArticles) = validArticles.reduce(into: ([Article](), [Article]())) { result, element in if element.date <= sevenDaysLater { result.0.append(element.article) } else { result.1.append(element.article) } }
4. 可选:给分组后的数组排序
如果需要每组内的条目按日期排序(比如最近的在前),可以加上这段代码:
// 7天内的条目按日期升序排列(最早的在前) let sortedUpcoming = upcomingArticles.sorted { guard let date1 = dateFormatter.date(from: $0.dateField), let date2 = dateFormatter.date(from: $1.dateField) else { return false } return date1 < date2 } // 剩余条目按日期降序排列(最新的在前) let sortedPast = pastArticles.sorted { guard let date1 = dateFormatter.date(from: $0.dateField), let date2 = dateFormatter.date(from: $1.dateField) else { return false } return date1 > date2 }
小提示
- 如果遇到
dateField格式不正确的条目,上面的代码会把它们过滤掉,你可以根据需求调整:比如把这些解析失败的条目直接放到pastArticles里,或者单独收集起来处理。 - 如果只需要比较日期(忽略具体时间),可以用
Calendar.current.isDate(element.date, inSameDayAs: sevenDaysLater),或者把两个日期都调整到当天的起始时间再做比较。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

