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

如何正确构建[DateComponents: EventType]类型的日期字典?

问题原因与解决方案

你的核心问题是每次循环都直接给eventDate重新赋值一个新字典,导致之前的条目被完全覆盖,最终只剩最后一条。要实现累加条目到字典的效果,需要修改为向已有字典中添加键值对,而不是替换整个字典。

修改步骤

1. 修正循环内的字典赋值逻辑

把循环里直接替换字典的代码,改成往字典中添加键值对:

// 先确保eventDate初始化为空字典(如果之前没初始化的话)
var eventDate: [DateComponents: EventType] = [:]

for employee in eventArrayIcon {
    guard let dateEnd = employee.dateEnd else {
        continue // 如果dateEnd为nil,跳过当前条目
    }
    let (year, month, day) = dateTimestampDividedInt(date: dateEnd)
    
    let dateComponents = DateComponents(
        calendar: Calendar(identifier: .gregorian),
        year: year,
        month: month,
        day: day
    )
    // 关键:用下标赋值添加/更新键值对,而不是替换整个字典
    eventDate[dateComponents] = .busy
}

2. 优化日期处理函数(可选但推荐)

原函数里存在冗余参数传递,还可能因Calendar.current的地区差异导致日期解析不一致,建议统一使用公历并简化逻辑:

func dateTimestampDividedInt(date: TimeInterval) -> (year: Int, month: Int, day: Int) {
    let calendar = Calendar(identifier: .gregorian)
    let date = Date(timeIntervalSince1970: date)
    
    let day = calendar.component(.day, from: date)
    let month = calendar.component(.month, from: date)
    let year = calendar.component(.year, from: date)
    
    return (year, month, day)
}

3. 注意DateComponents的哈希特性

DateComponents作为字典key时,只有当包含的字段(这里是calendar、year、month、day)完全匹配时,才会被识别为同一个key。确保你创建的DateComponents只保留这几个必要字段,避免多余字段导致key不匹配。

最终效果

修改后,循环会逐个将每个员工的日期条目添加到eventDate字典中,最终得到包含所有目标条目的字典,不会再出现覆盖问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:50:08