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

SwiftUI中使用@State变量初始化随机数生成器报错的问题

解决SwiftUI中无法在属性初始化器使用实例成员的问题

错误原因

你遇到的报错是因为SwiftUI的属性初始化器在视图实例完全创建前就执行,此时shortestWait和longestWait这些@State实例成员还未完成初始化,自然无法被引用。另外注意你代码里的变量名拼写错误:longestestWait应该改为longestWait。

解决方案

根据你对随机数生成时机的需求,有几种不同的实现方式:

1. 仅在视图初始化时生成一次随机数

如果随机数只需要在视图创建时生成一次,可通过手动初始化@State包装器来实现:

struct ContentView: View {
    @State var shortestWait: Int
    @State var longestWait: Int
    @State var randomInt: Int

    init() {
        let initialShortest = 30
        let initialLongest = 60
        _shortestWait = State(initialValue: initialShortest)
        _longestWait = State(initialValue: initialLongest)
        _randomInt = State(initialValue: Int.random(in: initialShortest...initialLongest))
    }

    var body: some View {
        // 你的视图内容
    }
}

这里需要直接初始化@State的底层包装器(_变量名),因为在init中无法直接给@State变量赋值。

2. 响应输入变化自动生成随机数

如果需要在shortestWait或longestWait被修改时自动更新随机数,可使用onChange修饰符,搭配onAppear做初始化:

struct ContentView: View {
    @State var shortestWait = 30
    @State var longestWait = 60
    @State var randomInt = 0

    var body: some View {
        VStack {
            TextField("最短等待", value: $shortestWait, format: .number)
                .textFieldStyle(.roundedBorder)
            TextField("最长等待", value: $longestWait, format: .number)
                .textFieldStyle(.roundedBorder)
            Text("生成的随机数:\(randomInt)")
                .padding()
        }
        .onAppear {
            // 视图首次出现时初始化随机数
            randomInt = Int.random(in: shortestWait...longestWait)
        }
        .onChange(of: [shortestWait, longestWait]) { _, _ in
            // 当两个输入值变化时,重新生成随机数
            randomInt = Int.random(in: shortestWait...longestWait)
        }
        .padding()
    }
}

3. 手动触发生成随机数

如果希望用户通过按钮主动生成随机数,只需给按钮绑定生成逻辑即可:

struct ContentView: View {
    @State var shortestWait = 30
    @State var longestWait = 60
    @State var randomInt = 0

    var body: some View {
        VStack {
            TextField("最短等待", value: $shortestWait, format: .number)
                .textFieldStyle(.roundedBorder)
            TextField("最长等待", value: $longestWait, format: .number)
                .textFieldStyle(.roundedBorder)
            Text("生成的随机数:\(randomInt)")
                .padding()
            Button("生成随机数") {
                randomInt = Int.random(in: shortestWait...longestWait)
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
        .onAppear {
            randomInt = Int.random(in: shortestWait...longestWait)
        }
    }
}

内容的提问来源于stack exchange,提问作者Onipony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:46:25