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)
}
}
}
然后你会得到这样的结果:
如果名称数组只有两个元素,那么它只显示两个结果。如果名称数组只有两个元素,那么它只显示两个结果。如何显示阵列颜色中的三种颜色