Swift函数中比较运算符返回值不符合预期问题排查
SwiftUI状态不同步问题:函数返回错误布尔值的解决办法
核心问题
你写的checkTapped函数里自己声明了一个@State var values = storedValues(),这个实例和ContentView里用来跟踪按钮点击的values完全是两个独立的对象。函数里的values.count永远是初始值0,所以无论你点击哪个按钮,values.count == val都会返回false,按钮背景永远是灰色。
另外要注意:@State只能在View结构体内部声明,它是用来绑定当前视图状态的属性包装器,放在普通函数里会创建脱离当前视图的独立状态,根本无法和页面上的状态同步。
修正方案
有两种简单的解决方式:
方案1:把判断方法放到ContentView内部
直接在ContentView里定义checkTapped方法,让它直接访问结构体里的values状态:
struct storedValues { var count = 0 } struct ContentView: View { @State private var values = storedValues() // 改为ContentView的私有方法,直接访问当前视图的values private func checkTapped(_ val: Int) -> Bool { values.count == val } var body: some View { VStack { HStack{ Text("Set count to 1") .padding() .onTapGesture { values.count = 1 } .background(checkTapped(1) ? .green : .gray) Text("Set count to 2") .padding() .onTapGesture { values.count = 2 } .background(checkTapped(2) ? .green : .gray) } if values.count == 1 { Text("Count = 1") .background(.green) } else if values.count == 2 { Text("Count = 2") .background(.green) } else { Text("Count != 1,2") } } } }
方案2:将状态作为参数传入独立函数
如果想把判断逻辑抽成全局函数,就把values实例作为参数传进去,让函数使用当前视图的状态:
struct storedValues { var count = 0 } // 独立函数,接收当前视图的values作为参数 func checkTapped(_ val: Int, currentValues: storedValues) -> Bool { currentValues.count == val } struct ContentView: View { @State private var values = storedValues() var body: some View { VStack { HStack{ Text("Set count to 1") .padding() .onTapGesture { values.count = 1 } .background(checkTapped(1, currentValues: values) ? .green : .gray) Text("Set count to 2") .padding() .onTapGesture { values.count = 2 } .background(checkTapped(2, currentValues: values) ? .green : .gray) } if values.count == 1 { Text("Count = 1") .background(.green) } else if values.count == 2 { Text("Count = 2") .background(.green) } else { Text("Count != 1,2") } } } }
关键提醒
SwiftUI的状态管理依赖属性包装器(比如@State、@Binding)和View结构体的绑定关系,不要在普通函数里随意声明@State变量,否则会创建完全独立的状态实例,导致页面状态和逻辑判断脱节。
内容的提问来源于stack exchange,提问作者Glorbothesupreme
相关产品推荐
相关产品推荐

