Swiftui 在列表中同时迭代两个数组

Swiftui 在列表中同时迭代两个数组,swiftui,swiftui-list,Swiftui,Swiftui List,如何迭代列表中的两个数组: struct ContentView: View { let colors = ["red", "green", "blue"] let names = ["John", "Apple", "Seed"] var body: some View { VStack { List(colors, id: \.self) { color in

如何迭代列表中的两个数组:

struct ContentView: View {
    let colors = ["red", "green", "blue"]        
    let names = ["John", "Apple", "Seed"] 

    var body: some View {           
        VStack {
            List(colors, id: \.self) { color in
                Text(color)
            }
        }
    }
}
例如,我需要: Text\color-\animal

我的代码是这样的我知道这是错误的,但这就是我的想法:

    List(colors, animals id: \.self) { color, animal in
        Text("\(color) - \(animal)")
    }

您可以将这两个数组设置为每个项目的一个对象,因为它们彼此相关。可以这样做:

struct Object: Identifiable {
    let id: UUID = UUID()
    let color: String
    let name: String
}

let objects = [Object(color: "red", name: "John"),
               Object(color: "green", name: "Apple"),
               Object(color: "blue", name: "Seed")]
这样使用:

List(objects) { object in
    Text("\(object.color) - \(object.name)")
}

您可以将这两个数组设置为每个项目的一个对象,因为它们彼此相关。可以这样做:

struct Object: Identifiable {
    let id: UUID = UUID()
    let color: String
    let name: String
}

let objects = [Object(color: "red", name: "John"),
               Object(color: "green", name: "Apple"),
               Object(color: "blue", name: "Seed")]
这样使用:

List(objects) { object in
    Text("\(object.color) - \(object.name)")
}
简单一点

var body: some View {
    VStack {
        List(Array(zip(colors, names)), id: \.self.0) { (color, name) in
            Text("\(color) - \(name)")
        }
    }
}
更新:添加了非等大小数组的变量

这个当然有点复杂,但可能会有帮助

var body: some View {
    VStack {
        ListOfPairs()
    }
}

private func ListOfPairs() -> some View {
    var iter = names.makeIterator()
    let container = colors.reduce(into: Array<(String,String)>()) { (result, color) in
        result.append((color, iter.next() ?? "None" )) // << placeholder for empty
    }

    return List(container, id: \.self.0) { (color, name) in
        Text("\(color) - \(name)")
    }
}
简单一点

var body: some View {
    VStack {
        List(Array(zip(colors, names)), id: \.self.0) { (color, name) in
            Text("\(color) - \(name)")
        }
    }
}
更新:添加了非等大小数组的变量

这个当然有点复杂,但可能会有帮助

var body: some View {
    VStack {
        ListOfPairs()
    }
}

private func ListOfPairs() -> some View {
    var iter = names.makeIterator()
    let container = colors.reduce(into: Array<(String,String)>()) { (result, color) in
        result.append((color, iter.next() ?? "None" )) // << placeholder for empty
    }

    return List(container, id: \.self.0) { (color, name) in
        Text("\(color) - \(name)")
    }
}

我认为这一切都有点麻烦,创建不需要的类型。因此,SwiftUI有ForEach语句。代码也可以如下所示:

导入快捷键

结构ContentView:View{

let colors = ["red", "blue", "black", "purple", "green"]
let names = ["Paul", "Chris", "Rob", "Terry", "Andy"]

var body: some View {

    List {
        ForEach(0 ..< colors.count) {
            Text("Name \(self.names[$0]) has favorite color \(self.colors[$0]).")
        }
        .onDelete(perform: deleteRow)
    }
}
}

结果如下所示:


当然,两个数组都需要相同数量的元素。

我认为这有点麻烦,创建不需要的类型。因此,SwiftUI有ForEach语句。代码也可以如下所示:

导入快捷键

结构ContentView:View{

let colors = ["red", "blue", "black", "purple", "green"]
let names = ["Paul", "Chris", "Rob", "Terry", "Andy"]

var body: some View {

    List {
        ForEach(0 ..< colors.count) {
            Text("Name \(self.names[$0]) has favorite color \(self.colors[$0]).")
        }
        .onDelete(perform: deleteRow)
    }
}
}

结果如下所示:


当然,两个数组都需要有相同数量的元素。

或者,如果您想得到两个漂亮的列,您可以按照自己的方式进行操作:

import SwiftUI

struct ContentView: View {

    let colors = ["red", "blue", "black", "purple", "green"]
    let names = ["Paul", "Chris", "Rob", "Terry", "Andy"]

    var body: some View {

        HStack {

            List(names, id: \.self) { name in
                Text(name)
            }
            .frame(width: 130)

            List(colors, id: \.self) { color in
                Text(color)
            }
            .frame(width: 160)
        }
    }
}    
然后你会得到这样的结果:

或者,如果您想得到两个漂亮的列,您可以按照自己的方式进行操作:

import SwiftUI

struct ContentView: View {

    let colors = ["red", "blue", "black", "purple", "green"]
    let names = ["Paul", "Chris", "Rob", "Terry", "Andy"]

    var body: some View {

        HStack {

            List(names, id: \.self) { name in
                Text(name)
            }
            .frame(width: 130)

            List(colors, id: \.self) { color in
                Text(color)
            }
            .frame(width: 160)
        }
    }
}    
然后你会得到这样的结果:

如果名称数组只有两个元素,那么它只显示两个结果。如果名称数组只有两个元素,那么它只显示两个结果。如何显示阵列颜色中的三种颜色