Swift: получение значений структуры в представлении Swiftui не работает - PullRequest
1 голос
/ 05 августа 2020

Я новичок в Swift, и мне нужно определить некоторую форму глобального словаря, чтобы я мог получить доступ к содержимому в моем проекте. Насколько я понимаю, для этого можно использовать класс структуры, поэтому

Я создал структуру и добавил к ней значения, теперь я хочу получить доступ к каждому из этих значений в представлении

это моя структура продукта

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. Что делаю не так? Я все время получаю эту ошибку

Generi c struct 'ForEach' требует, чтобы 'Product' соответствовал 'Hashable' Initializer 'init (_ :)' требует, чтобы 'Product' соответствовал 'StringProtocol'

1 Ответ

0 голосов
/ 05 августа 2020

Вам необходимо установить "searchResults" равным вашему "productList". Прямо сейчас ваш searchResults ПУСТО. Он просто существует как экземпляр вашей структуры без данных в нем.

один из вариантов - сделать область видимости переменной глобальной, а затем установить для нее новую переменную =

self.searchResults = Global.productList 

- РЕДАКТИРОВАТЬ

Вы близко. Где вы устанавливаете здесь свой var

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

EDIT - Hashable Erorr

попробуйте это

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