Swift:在swiftui视图中检索结构值不起作用

时间:2020-08-05 17:25:08

标签: swift swiftui

我是新手,需要定义某种形式的Global Dictionary,以便可以在整个项目中访问其内容。我的理解是可以使用struct class

我创建了一个结构并为其添加了值,现在我想访问视图中的每个值

这是我的产品结构

struct Product {
    
    let name: String
    let aisleNo:Int
    let location_section: Int
    let location_zone: String
    let productPrice: Int
}

然后创建了一个全局

import Foundation

struct Global {
    static var productList = [Product]() 
}

这就是我将许多产品附加到产品上的方式

class SearchResult : ObservableObject {
        var productList = [Product]()
         //There could be hundreds of product in the array
        for product in productArray {
            let productName = product.productName!
            let aisleNo = product.productLocation_aisle.value!
            let location_section = product.productLocation_section.value!
            let location_zone = product.productLocation_zone!
            let productPrice =  product.productPrice.value!
            let product_real_id = product._id!
            
            Global.productList.append(Product(name: productName, aisleNo: aisleNo, location_section: location_section, location_zone: location_zone, productPrice: Int(productPrice)))

}

这是我要在其中显示产品内容的搜索结果视图

struct SearchResultView: View {
      var searchResults = Global.productList

        var body: some View {

               VStack {
               List {
                ForEach(model.searchResults, id: \.self) { text in
                    Text(text)
                }
               
               
               }

           }
              }
 }

我似乎可以将其显示在searchResultView中。怎么了? 我不断收到此错误

通用结构“ ForEach”要求“产品”符合“可哈希化” 初始化程序“ init(_ :)”要求“产品”符合“ StringProtocol”

1 个答案:

答案 0 :(得分:0)

您需要将“ searchResults”设置为等于“ productList” 现在,您的searchResults为EMPTY。它只是作为您的结构实例存在而没有数据。

一种选择是使变量作用域成为全局范围,然后将新变量=设置为它

self.searchResults = Global.productList 

-编辑

您很近。 在此处设置变量的位置

var searchResults = Global.productList

它必须是这样的。

var searchResults = [Product]() // ->Creates an instance of the struct object

然后将其设置为等于全局数组。

self.searchResults = Global.productList

还应删除冗余变量var productList = [Product]()

此外,一些注意事项

for product in productArray {
      let productName = product.productName!
      let aisleNo = product.productLocation_aisle.value!
      let location_section = product.productLocation_section.value!
      let location_zone = product.productLocation_zone!
      let productPrice =  product.productPrice.value!
      let product_real_id = product._id!
            
      Global.productList.append(Product(name: productName, aisleNo: aisleNo, location_section: location_section, location_zone: location_zone, productPrice: Int(productPrice)))
}

您正在使用所有let变量来做额外的工作。 更好的方法是这样做。

for product in productArray {

      Global.productList.append(Product(name: product.name, aisleNo: product.aisleNo, location_section: product.location_section, location_zone: product.location_zone, productPrice: Int(product.productPrice)))
}

编辑-哈希错误

尝试一下

struct Product: Hashable {
    let name: String
    let aisleNo:Int
    let location_section: Int
    let location_zone: String
    let productPrice: Int
}