SwiftUI 函数显示"Modifying state during view update, this will cause undefined behavior."



代码的工作方式,它带来了5个随机辅音和2个元音,就像我想要的,但它显示了一个警告消息,"在视图更新期间修改状态,这将导致未定义的行为。">

我对Swift相当陌生,当我搜索swiftui和"在视图更新期间修改状态,这将导致未定义的行为"时,我不理解我在网上阅读的答案。至少我的理解还不够好,无法修复自己的代码。我没有更接近弄清楚如何修改我的代码来摆脱警告。请帮助。

供参考-我想保持我的元音和辅音在(排序)数组中,当按下按钮滚动新的随机元音和辅音时更新。

import SwiftUI
struct ContentView: View {
@State private var vowels = ["X","X"]
@State private var consonants = ["X","X","X","X","X"]

var body: some View {
VStack {
Spacer()
Text(rollConsonants())
Text(rollVowels())
Spacer()
Button("Reroll") {
_ = rollVowels()
_ = rollConsonants()
}
}
.font(.largeTitle)
}


func rollVowels() -> String {
vowels = ["A","E","I","O","U"].shuffled().prefix(2).sorted()   // message here
let string = vowels.joined(separator:"   ")
return string
}

func rollConsonants() -> String {
let commonConsonants = ["C","D","L","N","R","S","T"].shuffled().prefix(2)
var otherConsonants = ["B","F","G","H","K","M","P","V","W","Y","*"].shuffled().prefix(3)
let rareConsonants = ["J","Q","X","Z"].shuffled()
if let i = otherConsonants.firstIndex(of: "*") {
otherConsonants[i] = rareConsonants[0]
}
consonants = (commonConsonants + otherConsonants).sorted()   // message here
let string = consonants.joined(separator:"   ")
return string
}

}

这是因为:

Text(rollConsonants())
Text(rollVowels())

当SwiftUI试图渲染文本时,你正在修改状态。

这个修改通过将更新状态的行为与读取状态的行为分开来修复警告:

import SwiftUI
struct ContentView: View {
@State private var vowels = ["X", "X"]
@State private var consonants = ["X", "X", "X", "X", "X"]
var formattedVowels: String {
vowels.joined(separator: "   ")
}
var formattedConsonants: String {
consonants.joined(separator: "   ")
}
var body: some View {
VStack {
Spacer()
Text(formattedConsonants)
Text(formattedVowels)
Spacer()
Button("Reroll") {
rollVowels()
rollConsonants()
}
}
.font(.largeTitle)
}
func rollVowels() {
vowels = ["A", "E", "I", "O", "U"].shuffled().prefix(2).sorted() // message here
}
func rollConsonants() {
let commonConsonants = ["C", "D", "L", "N", "R", "S", "T"].shuffled().prefix(2)
var otherConsonants = ["B", "F", "G", "H", "K", "M", "P", "V", "W", "Y", "*"].shuffled().prefix(3)
let rareConsonants = ["J", "Q", "X", "Z"].shuffled()
if let i = otherConsonants.firstIndex(of: "*") {
otherConsonants[i] = rareConsonants[0]
}
consonants = (commonConsonants + otherConsonants).sorted() // message here
}
}

相关内容

最新更新