SwiftUI嵌套数组ForEach报错:无法转换[[ButtonModel]]为Binding类型
报错原因
- 核心原因是类型不匹配导致编译器推导失败:内层
ForEach遍历得到的是ButtonModel结构体实例,你直接将实例与字符串"/"做相等判断、直接将实例传入Button的文本参数,两种类型完全不匹配,编译器无法正确推导泛型参数,就抛出了「Generic parameter 'C' could not be inferred」错误,类型推导混乱同时会引发误报的Binding转换错误。 - 外层
ForEach的标识存在隐患:你使用id: \.self作为外层数组的唯一标识,要求内层的[ButtonModel]数组元素实现Equatable协议,否则也会引发编译或运行时异常。
修复方案
首先所有需要用到按钮文本的地方,都访问ButtonModel的value属性取字符串值。如果有外层ForEach的相关警告,给ButtonModel加上Equatable协议遵从即可。
修复后的布局代码
VStack { ForEach(viewModel.buttons, id: \.self) { buttons in HStack(spacing: GridPoints.x2) { Spacer() ForEach(buttons) { buttonModel in if buttonModel.value == "/" { imageButton(for: Asset.Image) { viewModel.addValue(buttonModel.value) } } else { Button(buttonModel.value, action: { viewModel.addValue(buttonModel.value) }) .buttonStyle(customFont: .h3) .background(Color.backgroundColor) .styleText(style: TextStyle.h3) } } Spacer() } .padding(GridPoints.x1) } }
可选:ButtonModel补充Equatable遵从
struct ButtonModel: Identifiable, Equatable { let id = UUID() let value: String let style: ColorStyle init(_ value: String, _ style: ColorStyle) { self.value = value self.style = style } }
内容的提问来源于stack exchange,提问作者Vollan
相关产品推荐
相关产品推荐

