如何使用willSet更新或更正Swift中的某些值?

如何使用willSet更新或更正Swift中的某些值?,swift,swiftui,Swift,Swiftui,我想使用willSet来控制一个条件,并为设置正确的值做必要的工作,但willSet并没有帮助条件发生!值仍然大于5,我做错了什么 import SwiftUI struct ContentView: View { @State private var value: Int = Int() { willSet(newValue) { if newValue > 5 {

我想使用willSet来控制一个条件,并为设置正确的值做必要的工作,但willSet并没有帮助条件发生!值仍然大于5,我做错了什么

import SwiftUI

struct ContentView: View {

    @State private var value: Int = Int() {
        
        willSet(newValue) {
            
            if newValue > 5 {
                
                value = 5
            }
            
        }
  
    }

    var body: some View {
        Text(value.description)
            .padding()
        
        Button("random update") { value = Int.random(in: 0...10) }
    }
}

改用
didSet

struct Foo {
    var value: Int = 0 {
        didSet {
            if value > 5 {
                value = 5
            }
        }
    }
}

var foo = Foo()
foo.value = 6
print(foo.value) // 5
编辑:

为了说明在观察到
6
之前,将
值设置为5:

import SwiftUI

struct MySwiftUIView: View {
    @State private var value: Int = 0 {
        didSet {
            print("setting value to \(value)")
            
            if value > 5 {
                value = 5
            }
        }
    }
    
    var body: some View {
        VStack {
            Text(valueAsText)
                .padding()
            Button("Set value to >5") { value = 6 }
        }
    }
    
    private var valueAsText: String {
        print("value: \(value)")
        
        return "\(value)"
    }
}

struct MySwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        MySwiftUIView()
    }
}
点击按钮将输出以下内容:

value: 0
setting value to 6
setting value to 5
value: 5

这回答了你的问题吗?“将设置”意味着它将设置。所以,在你设置了一个新的值之后,它在执行closure之后仍然会设置一个新的值。谢谢,我的重点是不允许在一开始就设置错误的值,我可以在按钮区域完成这项工作,但我非常有兴趣用willSet或didSet@LeoDabus:我们可以用一些代码从willSet中去除didSet吗?我的意思是一些使didSet不起作用的代码。在存储值之前调用willSet。存储新值后立即调用didSet。我甚至不想在一开始就存储错误的值。这就是为什么我用willSet攻击这个问题。这个问题是在它的willSet中设置一个值,它永远不会覆盖setter,因为setter总是在后面出现。为什么不干脆
value=min(value,5)
@LeoDabus好点,我喜欢it@swiftPunk是在SwiftUI中编码时,您可以使用
.onChange
钳制您的值