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

Posted

技术标签:

【中文标题】如何在正文视图中使用计数器来填充列表【英文标题】:How do I use a counter within body View to fill a list 【发布时间】:2020-05-17 15:22:11 【问题描述】:

我是 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)])
        
    

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

这是我的解决方案,但现在我收到 products.firstIndex(of: product) 的错误。

我收到以下错误:

可选类型“Array.Index?”的值(又名“可选”)必须解包为“Array.Index”(又名“Int”)类型的值

我并没有真正理解这个错误试图告诉我什么。

有人可以帮忙吗?

【问题讨论】:

没关系,发现我的错误。不得不添加一个!在 firstIndex 方法中。 【参考方案1】:

正确的代码如下所示:

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,则该数组可能在某些时候为空,这会导致崩溃。

现在你有两个选择:

    用“!”强制解包如果您确定数组永远不会被清除/为空,就像我在上面所做的那样。 如果值在某些时候可能为零,请使用“?? value”提供默认值。

【讨论】:

以上是关于如何在正文视图中使用计数器来填充列表的主要内容,如果未能解决你的问题,请参考以下文章

如何获取剑道列表视图数据项计数

如何在可扩展列表视图 Kotlin 中获取标题中的子项计数

如何在重置之前向日志添加值(CoreData 和 Swift)

如何从 Flutter 中的网格视图计数访问生成列表中的特定单元格?

Flutter 水平列表视图点指示器

提供实体计数的 NSFetchedResultsController 对象