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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:42:00