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

Swift技术实现:判断日期是否与日期数组中任意日期为同一天

解决日期匹配判断问题:检查posts中是否存在同一天的记录

哥们,你遇到的这个问题我太熟悉了——你当前用reduce的写法确实有逻辑漏洞:因为你把每一步的判断结果直接替换了累积值,要是前面有匹配的true,后面碰到不匹配的post,结果就又被改成false了,完全达不到「只要有一个匹配就返回true」的需求。

下面给你两种解决思路,优先推荐第一种:

方案1:用contains(where:)(最简洁高效)

Swift的集合类型自带contains(where:)方法,专门用来判断集合中是否存在满足指定条件的元素。它会在找到第一个符合条件的元素后立即停止遍历,性能比reduce更优,代码语义也更清晰。

修改后的代码如下:

var date = month?.startOfMonth()
var end = month?.endOfMonth()
while date! <= end! {
    // 判断是否存在同一天的post
    let hasMatchingPost = posts.contains { post in
        Calendar.current.isDate(date!, inSameDayAs: post.timeStamp)
    }
    
    if hasMatchingPost {
        // 这里写你匹配成功后的逻辑
    }
    
    date = Calendar.current.date(byAdding: .day, value: 1, to: date!)
}

方案2:调整reduce的累积逻辑(兼容原有写法)

如果你一定要用reduce,可以把累积逻辑改成逻辑或(||),这样只要之前的累积结果已经是true,后续的判断就不会改变这个结果,完美实现「只要有一个匹配就返回true」的效果:

var date = month?.startOfMonth()
var end = month?.endOfMonth()
while date! <= end! {
    let hasMatchingPost = posts.reduce(false) { accumulatedResult, post in
        // 用逻辑或保留之前的true结果
        accumulatedResult || Calendar.current.isDate(date!, inSameDayAs: post.timeStamp)
    }
    
    if hasMatchingPost {
        // 匹配成功后的逻辑
    }
    
    date = Calendar.current.date(byAdding: .day, value: 1, to: date!)
}

还是强烈推荐方案1,因为contains(where:)的代码可读性更高,别人一看就知道你在做「检查集合是否存在符合条件的元素」这件事,而且不用遍历全部元素,性能更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:41:57