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
相关产品推荐
相关产品推荐

