如何在SwiftUI/Swift中基于自定义区间生成随机整数
问题根源
你编写的代码无法达到预期的核心原因有两个:
- @State属性的初始值仅会在视图实例化时计算一次,后续你通过TextField修改
minValue、maxValue的数值,不会触发mainNum重新生成随机数 - 缺少边界校验逻辑,如果用户输入的
minValue大于maxValue,直接生成区间随机数会触发崩溃
完整实现代码
import SwiftUI struct RandomNumberView: View { @State private var minValue: Int = 0 @State private var maxValue: Int = 100 @State private var mainNum: Int = 0 // 数字格式化器,用于TextField直接绑定Int类型 private let numberFormatter: NumberFormatter = { let formatter = NumberFormatter() formatter.numberStyle = .none return formatter }() var body: some View { VStack(spacing: 24) { HStack { Text("最小值:") .frame(width: 60, alignment: .leading) TextField("请输入最小值", value: $minValue, formatter: numberFormatter) .textFieldStyle(.roundedBorder) .keyboardType(.numberPad) } HStack { Text("最大值:") .frame(width: 60, alignment: .leading) TextField("请输入最大值", value: $maxValue, formatter: numberFormatter) .textFieldStyle(.roundedBorder) .keyboardType(.numberPad) } Text("随机数结果:\(mainNum)") .font(.title2) .fontWeight(.medium) Button("生成新随机数") { updateRandomNumber() } .buttonStyle(.borderedProminent) } .padding() // 视图加载时生成初始随机数 .onAppear { updateRandomNumber() } // 可选:修改最小值/最大值后自动更新随机数 .onChange(of: minValue) { _ in updateRandomNumber() } .onChange(of: maxValue) { _ in updateRandomNumber() } } // 抽取公共的随机数更新方法,避免重复代码 private func updateRandomNumber() { // 自动修正边界,保证区间合法 let validMin = min(minValue, maxValue) let validMax = max(minValue, maxValue) mainNum = Int.random(in: validMin...validMax) } }
关键说明
- 把随机数生成逻辑抽为独立方法,避免多处重复编写
- 生成随机数前自动校正区间边界,不管用户输入的min和max大小关系如何都不会崩溃
- 可根据需求选择触发随机数更新的时机:仅点击按钮更新,或者修改数值后自动更新
- 使用
NumberFormatter处理TextField和Int类型的绑定,不需要手动处理字符串转整数的逻辑
内容的提问来源于stack exchange,提问作者Pavel Lenkevich
相关产品推荐
相关产品推荐

