gpt4 book ai didi

ios - 在 SwiftUI 中将 @Binding 变量从协议(protocol) var 传递给 if

转载 作者:行者123 更新时间:2023-12-01 21:30:35 24 4
gpt4 key购买 nike

我有一个这样的模型:

protocol PurchasableProduct {
var randomId: String { get }
}

class Cart: Identifiable {
var items: [PurchasableProduct]

init(items: [PurchasableProduct]) {
self.items = items
}
}

class Product: Identifiable, PurchasableProduct {
var randomId = UUID().uuidString
var notes: String = ""
}

class DigitalGood: Identifiable, PurchasableProduct {
var randomId = UUID().uuidString
}
在哪里 items符合协议(protocol) PurchasableProduct .
我想构建一个显示购物车的 View ,如下所示:
struct CartView: View {
@State var cart: Cart

var body: some View {
List {
ForEach(cart.items.indices) { index in
CartItemView(item: self.$cart.items[index])
}
}
}
}
在哪里 CartItemView是:
struct CartItemView: View {
@Binding var item: PurchasableProduct

var body: some View {
VStack {
if self.item is Product {
Text("Product")
} else {
Text("Digital Good")
}
}
}
}
那行得通,给我结果
This (screenshot)
但我想扩展这个,但比我的 items 还要多。元素可以作为绑定(bind)变量传递让我们说:
struct CartItemView: View {
@Binding var item: PurchasableProduct

var body: some View {
VStack {
if self.item is Product {
VStack {
TextField("add notes", text: (self.$item as! Product).notes) // ❌ Cannot convert value of type 'String' to expected argument type 'Binding<String>'
TextField("add notes", text: (self.$item as! Binding<Product>).notes) // ⚠️ Cast from 'Binding<PurchasableProduct>' to unrelated type 'Binding<Product>' always fails
}
} else {
Text("Digital Good")
}
}
}
}
我想要实现的是:
  • 我有一个依赖于类的项目集合应该以不同的方式绘制
  • 项目具有不同的可编辑同步,应绑定(bind)到 CartView

  • 不确定这是语法问题还是我的方法问题...如何在 body 上进行转换根据类型获得正确的 View ?

    最佳答案

    您可以创建自定义绑定(bind):

    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")
    }
    }
    }
    }

    关于ios - 在 SwiftUI 中将 @Binding 变量从协议(protocol) var 传递给 if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63042221/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com