如何使用willSet更新或更正Swift中的某些值?
我想使用willSet来控制一个条件,并为设置正确的值做必要的工作,但willSet并没有帮助条件发生!值仍然大于5,我做错了什么如何使用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 {
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
钳制您的值