arrays - 如何在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)
}
}
}
解决方案
您可以检查是否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)
}
}
}
推荐阅读
- javascript - 倒数计时器执行外部函数
- php - windows - 根 composer.json 需要 PHP 扩展 ext-gd *
- javascript - 我的变量没有传递给函数
- r - 获取 tibble/df 中多个类别的响应百分比
- html - Forloop 在 HTML 页面 Laravel 中保持为空
- java - 带有 Azure 身份验证错误的 Spring Boot OAuth2.0 - UserInfoEndpoint 中缺少客户端注册所需的“用户名”属性名称:天蓝色
- matlab - 通过使用 repmat 的 2D 曲线旋转生成 3D 绘图后提取 Z 值
- reactjs - 在 Reactjs 中使用全局字符串变量
- python - 使用令牌的 Bitbucket API 连接
- php - 如何使用外键约束连接多个表