如何通过循环检查7个日期数组匹配并返回对应UIColor?
问题描述
我有7个String类型的日期数组,示例如下:
var redArray : [String] = ["2022-07-13", "2022-07-14","2022-07-15"] var blueArray : [String] = ["2022-07-13", "2022-07-14","2022-07-16"] // 另有5个同格式数组
我已经实现了处理两个数组的逻辑:
if redArray.contains(someDate) && blueArray.contains(someDate) { return [UIColor.red, UIColor.blue] } else if redArray.contains(someDate) { return [UIColor.red] } else if blueArray.contains(someDate) { return [UIColor.blue] } return [UIColor.clear]
现在需要编写一个通过循环处理7个数组的方法:检查指定日期是否存在于数组中,返回所有匹配数组对应的UIColor数组;若无匹配则返回[UIColor.clear]。该方法将用于FSCalendar的代理方法中:
func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, eventDefaultColorsFor date: Date) -> [UIColor]? { ... }
希望找到简洁的循环实现方式,而非手动逐个判断。
简洁实现方案
核心思路是将日期数组与对应UIColor绑定为一组数据,通过遍历这组数据完成筛选,彻底避免重复的条件判断。
1. 构建日期-颜色映射集合
先把所有日期数组和对应的颜色整理成一个统一的数组,后续只需遍历这个集合即可:
// 定义数组,元素为(日期数组: [String], 对应颜色: UIColor) let dateColorPairs = [ (dates: redArray, color: UIColor.red), (dates: blueArray, color: UIColor.blue), // 依次添加剩余5组数组与对应颜色,例如(greenArray, .green)、(yellowArray, .yellow)等 ]
2. 实现循环筛选逻辑
在FSCalendar的代理方法中,先将传入的Date转换为与数组中一致的String格式(需保证格式完全匹配),再遍历映射集合筛选匹配项:
// 建议将DateFormatter定义为全局常量或类属性,避免重复创建损耗性能 private let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" formatter.locale = Locale(identifier: "en_US_POSIX") return formatter }() func calendar(_ calendar: FSCalendar, appearance: FSCalendarAppearance, eventDefaultColorsFor date: Date) -> [UIColor]? { // 转换日期格式为数组中的字符串格式 let targetDateString = dateFormatter.string(from: date) // 遍历映射集合,筛选出包含目标日期的项对应的颜色 let matchedColors = dateColorPairs.compactMap { pair in pair.dates.contains(targetDateString) ? pair.color : nil } // 无匹配时返回[.clear],否则返回匹配的颜色数组 return matchedColors.isEmpty ? [UIColor.clear] : matchedColors }
关键说明
- 使用
compactMap可以同时完成“过滤不匹配项”和“提取对应颜色”两个操作,代码简洁高效。 - 日期格式转换必须和数组中的字符串格式完全一致,建议固定
locale为en_US_POSIX避免因地区设置导致的格式差异。
内容的提问来源于stack exchange,提问作者Sergey_VC
相关产品推荐
相关产品推荐

