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

如何为Swift循环的每次迭代添加延迟?现有方案问题分析

问题分析与解决方案

为什么你的代码无效?

你遇到的问题核心在于:你的for循环是同步执行的。当循环运行时,它会在极短的时间内把10个delay(1)任务全部提交给主队列,每个任务都被安排在“当前时间+1秒”后执行。这就导致1秒后,所有10个闭包会几乎同时触发,count会一下子从0跳到10,而不是每秒递增1。


解决方案1:递归实现间隔执行

这种方法通过递归调用,确保上一次延迟执行完成后,再安排下一次的任务,真正实现每秒递增:

var count = 0

func incrementCountSequentially(remaining: Int) {
    guard remaining > 0 else { return }
    
    delay(1) {
        count += 1
        print("当前count值:\(count)") // 验证每秒输出一次
        self.incrementCountSequentially(remaining: remaining - 1)
    }
}

// 启动执行,总共执行10次
incrementCountSequentially(remaining: 10)

解决方案2:使用Timer定时器

如果你的场景更适合用定时器,这种方式代码更直观,也容易控制启停:

var count = 0
var incrementTimer: Timer?

// 启动定时器,每秒触发一次
incrementTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    count += 1
    print("当前count值:\(count)")
    
    // 达到10次后停止定时器
    if count >= 10 {
        timer.invalidate()
        incrementTimer = nil // 避免引用循环
    }
}

解决方案3:用Async/Await(Swift 5.5+)

如果你的项目支持Swift 5.5及以上版本,用异步等待的方式会更简洁易读:
首先把你的延迟函数改成支持async的版本:

func delay(_ delay: Double) async {
    try? await Task.sleep(nanoseconds: UInt64(delay * Double(NSEC_PER_SEC)))
}

然后用异步循环实现:

var count = 0

Task {
    for _ in 0...9 {
        await delay(1)
        count += 1
        print("当前count值:\(count)")
    }
}

这里的异步循环会等待每次延迟完成后,再进入下一次迭代,完美实现每秒递增的效果。


内容的提问来源于stack exchange,提问作者George_E -old

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:22:24