使用 ForEach SwiftUI 循环多个数组

Posted

技术标签:

【中文标题】使用 ForEach SwiftUI 循环多个数组【英文标题】:Looping multiple arrays with ForEach SwiftUI 【发布时间】:2020-12-19 19:09:58 【问题描述】:

用户界面:https://imgur.com/a/0BbJBFc

我在示例代码中使用ForEach 来遍历矿物数组,但我找不到合适的解决方案来循环矿物下方的第二个数组(矿物量)。

在不同的项目中,到目前为止,我做到了ForEach 循环两个数组,但对于每种矿物,都显示Planet 的所有数量,第二个矿物显示Planet 的所有数量等等。

我确实创建了一个包含两个数组的新结构,但没有成功。添加绑定属性也失败了。我希望学习一种新的快速方法来实现愿望的外观。

数据文件

import Foundation

struct Planet: Identifiable 
    var id = UUID()
    var name: String
    var minerals: [String]
    var mineralAmount: [String]


let planetsData: [Planet] = [

Planet(name: "Jupiter", minerals: ["Iron", "Gold", "Copper"], mineralAmount: ["10K", "20K", "30K"]),
Planet(name: "Earth", minerals: ["Lithium", "Aluminium", "Quartz"], mineralAmount: ["40K", "50K", "60K"])
]

内容视图

import SwiftUI

struct ContentView: View 
    
    var planet: Planet
    var body: some View 
    
      VStack() 
        ForEach(planet.minerals, id: \.self)  item in
            Text(item)
                .font(.system(size: 22, weight: .regular))
                        .foregroundColor(.primary)

                        Text("amount to be added")
                            .font(.system(size: 22, weight: .regular))
                            .foregroundColor(.primary)

                    
                
            
        
    

struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
            ContentView(planet: planetsData[0])
        
    


  [1]: https://i.stack.imgur.com/4MDKs.png

【问题讨论】:

其实我还没有得到目标,你想遍历planetsData,然后遍历每个行星的minerals,对吧? 矿物正下方是什么意思?您是否在同一页面上寻找两个不同的列表,一个是矿物,第二个是单个星球的矿物含量?您能否提供一些有关最终所需 UI 的示例? 没有。我想遍历矿物质,然后遍历矿物质量。一个列表以大字体显示“Iron”,在“10K”下方以小字体显示。 @emreoktem 刚刚添加了一个 UI 参考 【参考方案1】:

你可以这样实现:

ScrollView 
    VStack (alignment: .leading) 
        ForEach(0..<planet.minerals.count)  i in
            HStack 
                Circle()
                    .frame(width: 50, height: 50)
                    .foregroundColor(.black)
                    
                VStack (alignment: .leading) 
                    Text(planet.minerals[i])
                        .font(.system(size: 22, weight: .regular))
                        .foregroundColor(.primary)
                    Text(planet.mineralAmount[i])
                        .font(.system(size: 22, weight: .regular))
                        .foregroundColor(.secondary)
                
            
            
        
        Spacer()
    

【讨论】:

【参考方案2】:

你为什么不从这两个值创建一个字典

mineralsDic = [minerals: mineralAmount] 

我当然知道dictionary 的语法,但我只是想解释一下我的想法 + 你可以只创建一个复杂性更低、性能更好的循环,而不是创建 2 个循环

【讨论】:

这是正确答案。通过拥有两个单独的数组,您没有将数量与矿物质相关联。如果您要在某个时候对矿物阵列进行排序,则数量阵列将不匹配。通过使用字典,您可以键入矿物的数量。您可以将字典键用作 ForEach 中的项目,并使用当前的键迭代返回金额。 是的,您可以制作键数组并在其上循环,并使用 O(n) 而不是 O(n^2) 打印键的值和值 @Menaim SwiftUI 初学者在这里 ContentView 会在你的情况下迭代矿物Dic 吗?你能提供一些解决方案的代码吗?

以上是关于使用 ForEach SwiftUI 循环多个数组的主要内容,如果未能解决你的问题,请参考以下文章

视图模型数组上的 ForEach 循环问题导致 Xcode 编译错误 - SwiftUI

SwiftUI ListView 没有访问 ForEach 循环

SwiftUI:如何使用 ForEach 循环使用各种代码的各种结构?

SwiftUI 中按钮操作内的 ForEach 循环?

SwiftUI,IF 在 ForEach 循环内显示不同的文本

SwiftUI - 如果在 ForEach 循环内