SwiftUI通用TableColumn视图实现遇类型推断错误,求解决方案
解决SwiftUI TableColumn封装问题
问题分析
你当前的TableColumnView存在几个核心问题:
- 错误地将
Purchase实例作为参数传入,而实际上TableColumn的闭包会自动提供每行的Purchase对象,不需要提前传入 Double类型的factor无法直接与Decimal类型的price相乘,存在类型不兼容问题- 子视图无法直接访问父视图的
currencyStyle,需要显式传递 - 闭包参数缺少类型注解导致Swift无法推断类型
修正后的实现
1. 调整TableColumnView定义
struct TableColumnView: View { let title: String let factor: Decimal let currencyStyle: Decimal.FormatStyle.Currency var body: some View { TableColumn(title) { (purchase: Purchase) in // 明确标注闭包参数类型 Text(purchase.price * factor, format: currencyStyle) } } }
2. 修改TipTable中的调用方式
注意不需要传入purchase参数,Table会为每行自动注入对应的Purchase对象:
struct TipTable: View { let currencyStyle = Decimal.FormatStyle.Currency(code: "USD") var body: some View { Table(of: Purchase.self) { TableColumnView(title: "Base price", factor: 1, currencyStyle: currencyStyle) TableColumnView(title: "With 15% tip", factor: 1.15, currencyStyle: currencyStyle) TableColumnView(title: "With 20% tip", factor: 1.2, currencyStyle: currencyStyle) TableColumnView(title: "With 25% tip", factor: 1.25, currencyStyle: currencyStyle) } rows: { TableRow(Purchase(price: 20)) TableRow(Purchase(price: 50)) TableRow(Purchase(price: 75)) } } }
关键调整说明
- 明确闭包参数类型:给
TableColumn闭包内的purchase标注Purchase类型,直接解决类型推断失败的错误 - 统一数值类型:将
factor改为Decimal类型,避免Double与Decimal相乘的类型冲突(Swift会自动将字面量1、1.15等转换为Decimal) - 传递样式参数:将父视图的
currencyStyle作为参数传入子视图,确保格式化样式可以正常访问 - 移除多余参数:删除原本传入的
purchase实例,因为Table组件会自动为每行提供对应的数据对象
进一步优化(可选)
如果想让封装更通用,支持任意数据类型,可以改成泛型实现:
struct GenericTableColumnView<RowValue: Identifiable>: View { let title: String let valueTransform: (RowValue) -> Decimal let currencyStyle: Decimal.FormatStyle.Currency var body: some View { TableColumn(title) { row in Text(valueTransform(row), format: currencyStyle) } } } // 调用示例 GenericTableColumnView( title: "Base price", valueTransform: { $0.price }, currencyStyle: currencyStyle ) GenericTableColumnView( title: "With 15% tip", valueTransform: { $0.price * 1.15 }, currencyStyle: currencyStyle )
内容的提问来源于stack exchange,提问作者Marco de Wit
相关产品推荐
相关产品推荐

