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

如何通过循环检查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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:54:19