Ios 在SwiftUI中将@Binding变量从协议变量传递给if

Ios 在SwiftUI中将@Binding变量从协议变量传递给if,ios,swift,swiftui,Ios,Swift,Swiftui,我有一个这样的模型: 协议可购买产品{ var randomId:字符串{get} } 类别:可识别{ 可变项目:[可购买产品] 初始(项目:[可购买产品]){ self.items=项目 } } 类别产品:可识别、可购买的产品{ var randomId=UUID().uuistring var注释:String=“” } 数字商品类:可识别、可购买的产品{ var randomId=UUID().uuistring } 其中项目符合协议可购买产品 我想构建一个视图,显示如下购物车: str

我有一个这样的模型:

协议可购买产品{
var randomId:字符串{get}
}
类别:可识别{
可变项目:[可购买产品]
初始(项目:[可购买产品]){
self.items=项目
}
}
类别产品:可识别、可购买的产品{
var randomId=UUID().uuistring
var注释:String=“”
}
数字商品类:可识别、可购买的产品{
var randomId=UUID().uuistring
}
其中
项目
符合协议
可购买产品

我想构建一个视图,显示如下购物车:

struct-CartView:视图{
@状态变量cart:cart
var body:一些观点{
名单{
ForEach(cart.items.index){中的索引
CartItemView(项目:self.$cart.items[索引])
}
}
}
}
其中
CartItemView
为:

struct CartItemView:视图{
@绑定变量项:PurchasableProduct
var body:一些观点{
VStack{
如果self.item是产品{
文本(“产品”)
}否则{
文本(“数字商品”)
}
}
}
}
这很有效,给我一个结果

但是我想扩展这个元素,但更多的是我的
items
元素可以作为绑定变量传递,比如:

struct CartItemView:视图{
@绑定变量项:PurchasableProduct
var body:一些观点{
VStack{
如果self.item是产品{
VStack{
TextField(“添加注释”,文本:(self.$item as!Product).notes)//❌ 无法将“String”类型的值转换为预期的参数类型“Binding”
TextField(“添加注释”,文本:(self.$item as!Binding).notes)//⚠️ 从“Binding”转换到不相关类型“Binding”总是失败
}
}否则{
文本(“数字商品”)
}
}
}
}
我想要实现的是:

  • 我有一个项目集合,它取决于一个类,应该以不同的方式绘制
  • 项目具有不同的可编辑同步,应绑定到
    CartView

  • 不确定这是语法问题还是我的方法问题。。。如何在
    正文
    上强制转换此内容以获得基于类型的正确视图?

    您可以创建自定义绑定:

    struct CartItemView: View {
        @Binding var item: PurchasableProduct
    
        var product: Binding<Product>? {
            guard item is Product else { return nil }
            return .init(
                get: {
                    self.$item.wrappedValue as! Product
                }, set: {
                    self.$item.wrappedValue = $0
                }
            )
        }
        var body: some View {
            VStack {
                if product != nil {
                    TextField("add notes", text: product!.notes)
                } else {
                    Text("Digital Good")
                }
            }
        }
    }
    
    struct CartItemView:视图{
    @绑定变量项:PurchasableProduct
    var产品:绑定{
    保护项是产品else{return nil}
    return.init(
    获取:{
    self.$item.wrappedValue作为!产品
    },集:{
    self.$item.wrappedValue=$0
    }
    )
    }
    var body:一些观点{
    VStack{
    如果产品!=零{
    TextField(“添加注释”,文本:product!.notes)
    }否则{
    文本(“数字商品”)
    }
    }
    }
    }