Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Swift结构中的静音函数可以更改一个变量,但不能更改另一个?_Swift_Struct_Swiftui_Immutability - Fatal编程技术网

为什么Swift结构中的静音函数可以更改一个变量,但不能更改另一个?

为什么Swift结构中的静音函数可以更改一个变量,但不能更改另一个?,swift,struct,swiftui,immutability,Swift,Struct,Swiftui,Immutability,我正在尝试使用SwiftUI制作一种秒表,我很好奇为什么我的计时器类型方法可以更改一个变量的值,@State var progress:CGFloat=10.0,但不能更改另一个变量的状态,var running=true struct ContentView: View { @State var progress: CGFloat = 10.0 var running = true var body: some View { Button(actio

我正在尝试使用SwiftUI制作一种秒表,我很好奇为什么我的
计时器
类型方法可以更改一个变量的值,
@State var progress:CGFloat=10.0
,但不能更改另一个变量的状态,
var running=true

struct ContentView: View {

    @State var progress: CGFloat = 10.0
    var running = true

    var body: some View {
        Button(action: {self.startLoadingAgain()}) {

            ZStack {
                ZStack {
                    Circle()
                        .stroke(Color.green, style: StrokeStyle(lineWidth: 12.0))
                        .rotationEffect(Angle(degrees: -180))
                    Circle()
                        .trim(from: 0.0, to: progress / 10)
                        .stroke(Color.blue, lineWidth: 12.0)
                        .rotationEffect(Angle(degrees: -90))
                    Text("\(Int(progress))")
                    .bold()

                }
                }.padding()
        }.buttonStyle(PlainButtonStyle())
    }

    mutating func startLoadingAgain() {
        _ = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
            withAnimation() {
                self.progress -= 0.1
                self.running = false
                if self.progress <= 0.0 {
                    timer.invalidate()
                }
            }
        }
    }

}
struct ContentView:View{
@状态变量进度:CGFloat=10.0
var running=true
var body:一些观点{
按钮(操作:{self.startLoadingAgain()}){
ZStack{
ZStack{
圈()
.stroke(颜色.绿色,样式:StrokeStyle(线宽:12.0))
.旋转效应(角度(度:-180))
圈()
.修剪(从:0.0到:进度/10)
.笔划(颜色.蓝色,线宽:12.0)
.旋转效应(角度(度:-90))
文本(“\(Int(progress))”)
.bold()
}
}.padding()
}.buttonStyle(PlainButtonStyle())
}
突变函数{
_=Timer.scheduledTimer(withTimeInterval:0.1,repeats:true){Timer in
withAnimation(){
自我进步-=0.1
self.running=false

如果self.progress是因为Swift UI就是这样工作的。只有状态属性是可变的。即使是关于这个主题的第一个WWDC视频也解释了这一点。这是因为您实际上没有改变
进程
进程
正在使用
@State
属性包装器,它在内部创建一个堆分配框来存储您的值e、 并保存对该框的引用。引用永远不会更改,只要对象指向引用,这样您就不会变异
self
,也不需要将您的函数声明为
mutating
@State>,这是一个很好的信息。谢谢。我想我从未尝试过在变量之前使用'@State',而不使用它<代码>在该函数之前进行变异
,使代码正常工作。我真的以为我已经。。。