首页 > 解决方案 > 如何在swift ui中制作一个从不重复(连续)的随机数列表

问题描述

我创建了这段代码来制作一个随机列表,但从不重复(当彼此相邻时)数字。问题是该Text(String(numbers[i]))行给出了一个超出范围错误的索引,因为该数组还没有所有的值。我对 swift ui 很陌生,我不知道如何完成这样的事情。提前致谢

import SwiftUI

struct ContentView: View {
    @State var numbers: [Int] = []
    @State var previousNumber = Int()
    @State var randomNumber = Int()
    var body: some View {
        List{
            ForEach(0..<100) {i in 
                Text(String(numbers[i]))
            }
        }.navigationTitle("numbers")
        .onAppear() {
            for i in 0 ..< 100 {
                previousNumber = randomNumber
                randomNumber = Int.random(in: 0...9)
                while randomNumber == previousNumber {
                    randomNumber = Int.random(in: 0...9)
                }
                numbers += [randomNumber]
            }
            print(numbers)
        }
    }
}

标签: arraysswiftswiftui

解决方案


您可以检查是否numbers不为空。

我也做了一些调整:

  • 删除了不需要@State的变量。您还迭代循环 100 次更新状态变量,每次迭代多次。这不是一个好主意。注意tempNumbers用于创建数组,然后只更新numbers一次。
  • 使用repeat ... while循环来获得更整洁和更少重复的代码。
  • 修复了第一个数字永远不会是 的问题0,因为您已经将它设置为前一个数字。
struct ContentView: View {
    @State private var numbers = [Int]()

    var body: some View {
        List {
            if !numbers.isEmpty {
                ForEach(0 ..< 100) { i in
                    Text(String(numbers[i]))
                }
            }
        }
        .navigationTitle("numbers")
        .onAppear {
            var tempNumbers = [Int]()
            var previousNumber: Int?
            var randomNumber: Int?

            for _ in 0 ..< 100 {
                previousNumber = randomNumber

                repeat {
                    randomNumber = Int.random(in: 0 ... 9)
                } while randomNumber == previousNumber

                tempNumbers.append(randomNumber!)
            }

            numbers = tempNumbers
            print(numbers)
        }
    }
}

推荐阅读