Swift循环中的延迟

Swift循环中的延迟,swift,swiftui,Swift,Swiftui,我正在SwiftUI中创建一个简单的纸牌游戏(Set)。我有一个按钮,当点击时可以处理X张新卡。目前,它使所有卡片同时显示。我在想我怎样才能让它们一次一个出来 该交易通过将一张新卡附加到模型中的牌组阵列中来实现。ContentView显示网格中的每张卡 这是我在网上查看后目前拥有的。一次显示第一张卡,然后显示下一张卡 func deal(_ numberOfCards: Int) { withAnimation(Animation.easeInOut(duration: 1))

我正在SwiftUI中创建一个简单的纸牌游戏(Set)。我有一个按钮,当点击时可以处理X张新卡。目前,它使所有卡片同时显示。我在想我怎样才能让它们一次一个出来

该交易通过将一张新卡附加到模型中的牌组阵列中来实现。ContentView显示网格中的每张卡

这是我在网上查看后目前拥有的。一次显示第一张卡,然后显示下一张卡

func deal(_ numberOfCards: Int) {
        withAnimation(Animation.easeInOut(duration: 1)) {
            viewModel.deal()
        }
        for _ in 1..<numberOfCards {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {
                withAnimation(.easeInOut) {
                    viewModel.deal()
                }
            }
        }
    }
func交易(uNumberOfCards:Int){
带动画(Animation.easeInOut(持续时间:1)){
viewModel.deal()
}
对于uu1..试试这个

func deal(_ numberOfCards: Int) {
    withAnimation(Animation.easeInOut(duration: 1)) {
        viewModel.deal()
    }
    for i in 1..<numberOfCards {
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.7) {
            withAnimation(.easeInOut) {
                viewModel.deal()
            }
        }
    }
}
func交易(uNumberOfCards:Int){
带动画(Animation.easeInOut(持续时间:1)){
viewModel.deal()
}
对于1中的i..试试这个

func deal(_ numberOfCards: Int) {
    withAnimation(Animation.easeInOut(duration: 1)) {
        viewModel.deal()
    }
    for i in 1..<numberOfCards {
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.7) {
            withAnimation(.easeInOut) {
                viewModel.deal()
            }
        }
    }
}
func交易(uNumberOfCards:Int){
带动画(Animation.easeInOut(持续时间:1)){
viewModel.deal()
}

对于1..中的i,问题是从现在起0.7秒后开始所有循环。您希望将该间隔乘以循环索引的
。您可能还可以将其简化一点,例如:

func deal(_ numberOfCards: Int) {
    for i in 0..<numberOfCards {
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.7) {
            withAnimation(.easeInOut) {
                viewModel.deal()
            }
        }
    }
}
如果这是在一个类中,我可能会在计时器闭包中使用
[弱self]

guard let self = self else {
    timer.invalidate()
    return
}

问题是,从现在起0.7秒后,您将启动所有循环。您希望将该间隔乘以
for
循环索引。您可能还可以将其简化一点,例如:

func deal(_ numberOfCards: Int) {
    for i in 0..<numberOfCards {
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) * 0.7) {
            withAnimation(.easeInOut) {
                viewModel.deal()
            }
        }
    }
}
如果这是在一个类中,我可能会在计时器闭包中使用
[弱self]

guard let self = self else {
    timer.invalidate()
    return
}

考虑创建一个所有项目都已排队的自定义队列,然后在循环后执行队列。或者更好,因为您正在使用动画,所以使用关键帧动画?考虑创建一个所有项目已排队的自定义队列,然后在循环后执行队列。或者更好,因为您正在使用动画,所以使用关键帧动画什么?