SwiftUI从var body调用变异函数

Ale*_*tiş 7 ios swift swiftui xcode11

在Ray遵循的教程中,我设置了以下属性

struct ContentView : View {

    var rTarget = Double.random(in: 0..<1)
    var gTarget = Double.random(in: 0..<1)
    var bTarget = Double.random(in: 0..<1)
}
Run Code Online (Sandbox Code Playgroud)

这些当然是不可变的,因此除非我将该功能标记为变异的,否则我无法通过功能对其进行修改

func reset() {
    rTarget = Double.random(in: 0..<1)
    gTarget = Double.random(in: 0..<1)
    bTarget = Double.random(in: 0..<1)
}
Run Code Online (Sandbox Code Playgroud)

Cannot assign to property: 'self' is immutable

但我称此功能为 var body

mutating func reset() {
    rTarget = Double.random(in: 0..<1)
    gTarget = Double.random(in: 0..<1)
    bTarget = Double.random(in: 0..<1)
}

fileprivate mutating func displayAlert() -> Alert {
    return Alert(title: Text("Your Score"), message: Text("\(computeScore())"), dismissButton: Alert.Button.destructive(Text("Ok"), onTrigger: {
        self.reset()
    }))
}

 var body: some View {
    Button(action: {
        self.showAlert = true
    }) {
        Text("Hit Me!")
        }.presentation($showAlert) {
            displayAlert()
    }
}
Run Code Online (Sandbox Code Playgroud)

Cannot use mutating member on immutable value: 'self' is immutable

但是我不能标记var bodymutatingvar

'mutating' may only be used on 'func' declarations

因此,在这一点上,我想xTarget在用户每次单击警报按钮时重置这些值,并且我不知道此时的良好做法。

Let*_*ate 7

我正在写同一篇文章。

我没有遇到这个问题,因为我已经在使用@State属性包装器了。正如kontiki所建议的 Session 226(通过 SwiftUI 的数据流)对于了解在更新不同来源的数据时如何使用哪个属性包装器非常有用。

如果你想知道@State 是什么,这个答案就一应俱全。

这是我的代码:

@State var rTarget = Double.random(in: 0..<1)
@State var gTarget = Double.random(in: 0..<1)
@State var bTarget = Double.random(in: 0..<1)
@State var rGuess: Double
@State var gGuess: Double
@State var bGuess: Double
Run Code Online (Sandbox Code Playgroud)