尝试将 2 个具有不同数据类型的数组关联起来,并能够在 Swift 中访问它们的属性

问题描述 投票:0回答:1

我有以下问题。

我有 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 
swift swiftui
1个回答
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")
]
© www.soinside.com 2019 - 2024. All rights reserved.