SwiftUI中Binding访问属性报错:无法访问count只读属性
问题解决:Binding无法直接调用count的错误
错误原因:ForEach($model.cars)返回的循环变量是Binding<CarModel>类型,因此c.name是Binding<String>而非原生String。直接调用c.name.count时,编译器会混淆Binding的取值逻辑,导致报错。
以下是两种可行的解决方案,均能保留Binding的同时正常访问字符串属性:
方案1:通过wrappedValue访问绑定的实际值
直接获取Binding包裹的原生字符串值,再调用对应方法:
ForEach($model.cars) { c in if c.name.wrappedValue.count > 0 { // 访问wrappedValue拿到实际String CarView(car: c) } else { Text("test") } }
方案2:解构Binding与原生值
利用SwiftUI语法糖,同时获取绑定对象和原生对象,代码更简洁:
ForEach($model.cars) { $car in let car = car // 直接获取非绑定的CarModel实例 if car.name.count > 0 { CarView(car: $car) // 传递Binding给子视图 } else { Text("test") } }
修改后的完整代码(以方案2为例):
import SwiftUI import Observation struct CarModel: Identifiable { var id = UUID() var name: String } @Observable class TestModel { var cars = [CarModel(name: "__-1-_1")] } struct ContentView: View { @State var model = TestModel() var body: some View { VStack { ScrollView { LazyVStack { ForEach($model.cars) { $car in let car = car if car.name.count > 0 { CarView(car: $car) } else { Text("test") } } } } } .padding() } } #Preview { ContentView() } struct CarView: View { @Binding var car: CarModel var body: some View { Text("The car \(car.name)") } }
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

