不向数组追加新数据

Not append new data to an array

我想将新数据添加到我项目的列表中 但我做不到

我有一个 ContentView.swift 视图用于显示产品列表 在另一个视图(ShopView)中,我想将数据添加到产品数组 我的产品数组和我的 addProduct() 函数 在 Products.swift 文件中

请帮帮我 谢谢

ContentView.swift

struct ContentView: View {
    @ObservedObject var cart = Products()
    
    var body: some View {
        NavigationView{
            List {
                ForEach(cart.products) { product in
                    Text("\(product.name) \(product.price)$")
                }
            }
            .navigationBarItems(
                trailing: NavigationLink(destination: Shop()) {
                    Text("Go Shop")
                })
            .navigationBarTitle("Cart")
        }
    }
}

Product.swift

struct Product: Identifiable {
    var id = UUID()
    var name: String
    var price: Int
}

Shop.swift

struct Shop: View {
    @ObservedObject var cart = Products()
    
    var body: some View {
        VStack{
            Button("Add Product To Cart") {
                cart.addProduct(product: Product(name: "Name", price: 399))
            }
        }
    }
}

Products.swift

class Products: ObservableObject {
    @Published var products = [Product]()
    
    func addProduct(product: Product) {
        products.append(product)
        print("Product Added")
    }
}

现在,您正在创建 Products 的两个 不同实例 。如果要共享数据,则必须使用同一个实例

struct ContentView: View {
    @ObservedObject var cart = Products()
    
    var body: some View {
        NavigationView{
            List {
                ForEach(cart.products) { product in
                    Text("\(product.name) \(product.price)$")
                }
            }
            .navigationBarItems(
                trailing: NavigationLink(destination: Shop(cart: cart)) {  //<-- HERE
                    Text("Go Shop")
                })
            .navigationBarTitle("Cart")
        }
    }
}


struct Shop: View {
    @ObservedObject var cart : Products //<-- HERE
    
    var body: some View {
        VStack{
            Button("Add Product To Cart") {
                cart.addProduct(product: Product(name: "Name", price: 399))
            }
        }
    }
}

实现此类功能的另一种方法是使用环境对象。关于该方法的补充阅读:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views

我认为您会发现最简单的实现方式是将您的模型定义为:

class Products: ObservableObject {
    //Implement a shared resource here
    public static let shared = Products()

    // I would also make the published var name something different then the class name.
    // Otherwise you will be calling a lot of products.products.
    // Or you could change the name of the class to "Cart"
    @Published var products: [Product] = []
    
    func addProduct(product: Product) {
        products.append(product)
        print("Product Added")
    }
}

在您的结构中使用它: @ObservedObject var cart = Products.shared

这会给你一个共同的共享产品class。您不必担心在视图之间传递。