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

SwiftUI中移除数组元素前如何与原数组进行比较?

解决数组元素转移时的判断逻辑失效问题

问题根源

你的判断条件appearedNumber.count < numbers.count失效,核心原因是原数组numbers在每次操作中会被移除元素,长度持续缩短。初始numbers有6个元素,当appearedNumber的数量达到3时,numbers也只剩3个元素,此时3 < 3不成立,后续点击按钮无法继续执行元素转移,但实际上还有元素未处理完成。

解决方案

核心思路是保存原数组的初始长度,用这个固定值作为判断依据,而非依赖不断变化的numbers.count。

修改步骤

  1. 添加状态变量保存初始数组长度:
@State private let originalCount = 6 // 与初始numbers的元素数量一致
  1. 修改changeNumber函数的判断条件,同时修复初始空字符串被添加的问题:
func changeNumber() {
    // 基于初始长度判断,确保所有元素都能被处理
    if appearedNumber.count < originalCount {
        // 跳过第一次点击时的空currentNumber
        if !currentNumber.isEmpty {
            appearedNumber.append(currentNumber)
        }
        
        // 确保numbers不为空时再取元素
        guard !numbers.isEmpty else { return }
        
        let index = Int.random(in: 0..<numbers.count)
        currentNumber = numbers[index]
        numbers.remove(at: index)
    }
}

修改后的完整代码

struct ContentView: View {
    @State private var numbers = ["0", "1", "2", "3", "4", "5"]
    @State private let originalCount = 6
    @State private var currentNumber = ""
    
    @State private var appearedNumber = [String]()
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink {
                    SecondView(appearedNumber: $appearedNumber)
                } label: {
                    Text("Change view")
                }
                .padding()
                
                Text(currentNumber)
                    .font(.largeTitle)
                    .bold()
                
                Button {
                    changeNumber()
                } label: {
                    Text("Change person")
                        .font(.largeTitle)
                        .bold()
                }
                .padding()
            }
        }
    }
    
    func changeNumber() {
        if appearedNumber.count < originalCount {
            if !currentNumber.isEmpty {
                appearedNumber.append(currentNumber)
            }
            
            guard !numbers.isEmpty else { return }
            
            let index = Int.random(in: 0..<numbers.count)
            currentNumber = numbers[index]
            numbers.remove(at: index)
        }
    }
}


struct SecondView: View {
    @Binding var appearedNumber: [String]
    
    var body: some View {
        VStack {
            ForEach(0..<appearedNumber.count, id: \.self) { index in
                Text(appearedNumber[index])
                    .font(.largeTitle)
                    .bold()
            }
        }
    }
}

效果说明

修改后,判断条件基于初始数组的固定长度,无论numbers如何缩短,都能保证所有元素被依次转移到appearedNumber中,直到appearedNumber的元素数量等于初始数组长度,彻底解决判断提前失效的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:22:05