我有以下问题。
我有 2 个数组,它们使用不同的数据结构,但有一个共同属性出现在两个数组中(序列号)。我希望能够动态链接它们,以便:
a)当我在一个列表中选择一个项目时,我可以从另一个列表(例如组)访问相应项目的属性之一(例如具有相同序列号的项目)。
b)能够将它们组合成一个实时复合列表 - 我尝试创建一个包含两个元素的新结构,然后组合两个数组,但这不起作用
这是一个说明问题的简化项目。
struct Computer: Identifiable, Hashable {
let name, id, serial: String
}
struct InventoryRecord: Hashable {
let group, serial: String
}
var computers = [ Computer(name: "Mac1", id: "1", serial: "aaaaaaaaaaaa"), Computer(name: "Mac2", id: "2", serial: "aaaaaaaaaaab") ]
var groupRecords = [ InventoryRecord(group: "London", serial: "aaaaaaaaaaaa"), InventoryRecord(group: "NewYork", serial: "aaaaaaaaaaab") ]
struct ContentView: View {
@State var selection = Computer(name: "", id: "", serial: "")
var body: some View {
VStack {
List (computers, id: \.self, selection: $selection) { serial in
HStack {
Text(serial.name)
Text(serial.serial)
}
}
List (groupRecords, id: \.self) { serial in
HStack {
Text (String(describing: serial.group))
Text (String(describing: serial.serial))
}
}
Text("Selection is assigned to group:\(selection.name)")
}
.padding()
}
}
这是我组合数组的尝试:
var computers = [ Computer(name: "Mac1", id: "1", serial: "aaaaaaaaaaaa"), Computer(name: "Mac2", id: "2", serial: "aaaaaaaaaaab") ]
var groupRecords = [ InventoryRecord(group: "London", serial: "aaaaaaaaaaaa"), InventoryRecord(group: "NewYork", serial: "aaaaaaaaaaab") ]
struct ComputerEnhanced: Identifiable, Hashable {
let name, id, serial,group: String
}
let result2: ComputerEnhanced = zip(computers, groupRecords)
.map{ $0.0
在不同的对象类型之间创建一个通用协议(例如
HasSerialNumber
):
protocol HasSerialNumber {
var serial: String {
get
}
}
struct Computer: Identifiable, Hashable, HasSerialNumber {
let name, id, serial: String
}
struct InventoryRecord: Hashable, HasSerialNumber {
let group, serial: String
}
然后,您可以创建符合 HasSerialNumber 的对象数组,并编写将作用于这些对象/数组的方法:
var array: [HasSerialNumber] = [
Computer(name: "Hal 9000", id: "12", serial: "ABCD"),
Computer(name: "ENIAC", id: "1", serial: "EBCDIC"),
InventoryRecord(group: "a", serial: "ABCD")
]