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

Swift实现日期数组前后翻页取7条日期的for循环条件问题

连续翻页日期序列实现方案

场景与需求

  • 初始加载的日期数组:["24-05-2022", "25-05-2022", "26-05-2022", "27-05-2022", "28-05-2022", "29-05-2022", "30-05-2022"]
  • 页面提供两个操作按钮:Next(下一页)、Previous(上一页)
  • 交互规则:
    • 点击下一页:返回当前显示序列之后的7个连续日期,首次点击需返回["31-05-2022", "01-06-2022", "02-06-2022", "03-06-2022", "04-06-2022", "05-06-2022", "06-06-2022"],第二次点击返回07-06-2022至13-06-2022的7个日期,向后翻页最多支持10次
    • 点击上一页:返回当前显示序列之前的7个连续日期

现有代码问题

你当前实现的getNextDates()方法固定以self.presentDate为基准,每次仅计算该基准之后1-7天的日期,没有记录当前的翻页偏移状态,自然无法支持连续翻页、翻页次数限制的逻辑。原有代码如下:

func getNextDates() {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd-MM-YYYY"

    let selectedDate = self.presentDate

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd-MM-yyyy"
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+0:00")
    guard let selected = dateFormatter.date(from: selectedDate) else {
        fatalError()
    }
    let dateString = formatter.string(from: selected)
    print("Selected Date is ==>",dateString)
    let calendar = Calendar(identifier: .gregorian)
    for i in 1...7 {
        let newDate = calendar.date(byAdding: .day, value: i, to: selected)
        let formatter = DateFormatter()
        formatter.dateFormat = "dd-MM-YYYY"
        let dateString = formatter.string(from: newDate!)
        
        print("Next DAYS ARE ==>>",dateString)
    }
}

另外代码里日期格式化混用了YYYY和yyyy,YYYY对应的是ISO周日历的年份,普通公历日期要统一用yyyy,否则跨年周会出现日期解析错误。

实现逻辑

不需要固定for循环的范围为1...7,只需要额外维护两个状态值即可实现需求:

  • 记录当前相对于初始第一页的页码偏移量currentPageOffset,初始值为0
  • 定义最大向后翻页次数maxNextPageCount = 10,每页固定展示7条日期
  • 计算当前页日期时,for循环的天数偏移范围为:从currentPageOffset * 7 + 1开始,连续取7个日期即可
  • 点击下一页时先判断当前偏移量是否小于最大翻页次数,符合条件则偏移量+1,再计算当前页日期
  • 点击上一页时先判断当前偏移量是否大于0,符合条件则偏移量-1,再计算当前页日期

可直接复用的核心代码

// 视图模型/控制器内定义的状态与工具属性
var currentPageOffset = 0
let maxNextPageCount = 10
let pageSize = 7
let dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "dd-MM-yyyy"
    formatter.timeZone = TimeZone(abbreviation: "GMT+0:00")
    formatter.calendar = Calendar(identifier: .gregorian)
    return formatter
}()
// 锚点日期为初始第一页的最后一个日期,对应初始数组的"30-05-2022",提前解析为Date类型存储
var baseAnchorDate: Date!

// 通用方法:获取当前页的日期数组
func getCurrentPageDates() -> [String] {
    var dateList: [String] = []
    let startDayOffset = currentPageOffset * pageSize + 1
    for dayDelta in startDayOffset..<startDayOffset + pageSize {
        guard let targetDate = Calendar(identifier: .gregorian).date(byAdding: .day, value: dayDelta, to: baseAnchorDate) else {
            continue
        }
        dateList.append(dateFormatter.string(from: targetDate))
    }
    return dateList
}

// 下一页按钮点击触发方法
func onNextPageTap() -> [String]? {
    guard currentPageOffset < maxNextPageCount else {
        // 达到最大翻页限制,不执行翻页
        return nil
    }
    currentPageOffset += 1
    return getCurrentPageDates()
}

// 上一页按钮点击触发方法
func onPrevPageTap() -> [String]? {
    guard currentPageOffset > 0 else {
        // 已经在第一页,不执行翻页
        return nil
    }
    currentPageOffset -= 1
    return getCurrentPageDates()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:39:19