【问题标题】:Looping multiple arrays with ForEach SwiftUI使用 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 参考

标签: arrays swift swiftui


【解决方案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 吗?你能提供一些解决方案的代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多