为什么Swift结构中的静音函数可以更改一个变量,但不能更改另一个?
我正在尝试使用SwiftUI制作一种秒表,我很好奇为什么我的为什么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
计时器类型方法可以更改一个变量的值,@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',而不使用它<代码>在该函数之前进行变异
,使代码正常工作。我真的以为我已经。。。