如何在主体视图中使用计数器来填充列表

我是Swift的新手,尝试通过尝试新事物来感受它。现在我陷入了名单。我有两个数组,一个是产品,另一个是每种产品的价格。我想通过使用ForEach循环来填充列表。我使用一个HStack有两列。

为了更清楚一点,这是两个数组:

@state private var products = ["Coke", "Fanta", "Sprite", "Water]
private var prices = ["1,43$", "1,22$", "1,64$", "0,45$"]

现在,这是我的ContentView.swift的一部分:

var body: some View {
    List{
        ForEach(products, id: \.self) { product in
        HStack{
            Text(product)
            Spacer()
            Text(price[products.firstIndex(of: product)])
        }
    }
}

所以我的计划是,通过遍历产品数组,用产品名称填充每个单元格。然后我要显示相应的价格。为此,我选择了第二个文本,并在其中填充了价格。为了找到正确的价格数组索引,我从产品数组中获取了索引,因为它们是相似的。

That was my solution, but now I am getting an Error for the products.firstIndex(of: product).

我收到以下错误消息:

可选类型“ Array.Index?”的值(aka'Optional')必须解开为'Array.Index'类型的值(aka'Int')

我不是很了解此错误要告诉我什么。

有人可以帮忙吗?

评论
  • jalias
    jalias 回复

    正确的代码如下所示:

    struct ContentView: View {
    
        private var products = ["Coke", "Fanta", "Sprite", "Water"]
        private var prices = ["1,43$", "1,22$", "1,64$", "0,45$"]
    
        var body: some View {
            List{
                ForEach(products, id: \.self) { product in
                    HStack{
                        Text(product)
                        Spacer()
                        Text(self.prices[self.products.firstIndex(of: product)!])
                    }
                }
            }
        }
    }
    

    发生错误的原因是,如果您在该时刻尝试读取firstIndex,则该数组有时可能为空,从而导致崩溃。

    现在,您有两个选择:

    1. 用“!”强制解开如我上面所做的,如果您确定该数组永远不会清除/为空。
    2. 如果某个值在某些时候可能为零,则提供一个带有“ ?? value”的默认值。