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)
}否则{
文本(“数字商品”)
}
}
}
}