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
相关产品推荐
相关产品推荐

