我有四个数组列表:
var products: [Product] = []
var addressInfo: [AddressInfo] = []
var favorites: [Favorite] = []
var amounts: [Amount] = []
我想将它们全部合并为一个,所以我只有一个变量:
var combined = [Product/AddressInfo/Favorite/Amount]()
我该如何将它们合并到一个数组中 var cobmbined = [Combined]()
?
这是我的结构的两个示例:
struct Amount {
var amountsDeliveryCharge: Double
var amountsDriverTip: Double
init(
amountsDeliveryCharge: Double,
amountsDriverTip: Double
){
self.amountsDeliveryCharge = amountsDeliveryCharge
self.amountsDriverTip = amountsDriverTip
}
init(data: [String: Any]){
amountsDeliveryCharge = data[DatabaseRef.deliveryCharge] as? Double ?? 0.0
amountsDriverTip = data[DatabaseRef.driverTip] as? Double ?? 0.0
}
static func modelToData(amount: Amount) -> [String: Any] {
let data : [String: Any] = [
DatabaseRef.deliveryCharge : amount.amountsDeliveryCharge,
DatabaseRef.driverTip : amount.amountsDriverTip
]
return data
}
}
这是另一个结构:
struct Product {
var price: Double
var priceUnit: String
init(
price: Double,
priceUnit: String
){
self.price = price
self.priceUnit = priceUnit
}
init(data: [String: Any]){
price = data[DatabaseRef.price] as? Double ?? 0.0
priceUnit = data[DatabaseRef.priceUnit] as? String ?? ""
}
static func modelToData(product: Product) -> [String: Any] {
let data : [String: Any] = [
DatabaseRef.price : product.price,
DatabaseRef.priceUnit : product.priceUnit
]
return data
}
}
另外两个结构在结构上看起来也相似。
最佳答案
假设每个元素的顺序相同,创建一个具有适当属性的结构
struct Combined {
let product: Product
let addressInfo: AddressInfo
let favourite: Favourite
let amount: Amount
}
然后使用计数器循环遍历数组以进行索引,然后使用memberWise初始化程序创建实例,或者使用静态工厂函数来创建并返回数组:
static func makeFrom(products: [Product], addresses: [AddressInfo], favourites: [Favourite], amounts: [Amount]) -> [Combined] {
guard products.count == addresses.count, addresses.count == favourites.count, favourites.count == amounts.count else {fatalError()}. //handle better in practice
var combined = [Combined]()
for index in 0..<products.count {
combined.append(Combined(product: products[index],
addressInfo: addresses[index],
favourite: favourites[index],
amount: amounts[index])
}
return combined
}
上面的代码检查所有数组的长度是否相同,如果不是,则调用 FatalError()。实际上,您希望比这更好地处理错误。
然后用作:
let combined = Combined.makeFrom(products: products, addresses:addressInfo, favourites: favourites, amounts: amounts)
关于arrays - 将多个数组组合/合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59378352/