SwiftUI中移除数组元素前如何与原数组进行比较?
解决数组元素转移时的判断逻辑失效问题
问题根源
你的判断条件appearedNumber.count < numbers.count失效,核心原因是原数组numbers在每次操作中会被移除元素,长度持续缩短。初始numbers有6个元素,当appearedNumber的数量达到3时,numbers也只剩3个元素,此时3 < 3不成立,后续点击按钮无法继续执行元素转移,但实际上还有元素未处理完成。
解决方案
核心思路是保存原数组的初始长度,用这个固定值作为判断依据,而非依赖不断变化的numbers.count。
修改步骤
- 添加状态变量保存初始数组长度:
@State private let originalCount = 6 // 与初始numbers的元素数量一致
- 修改
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
相关产品推荐
相关产品推荐

