【问题标题】:Combine / Merge Multiple Arrays Into One将多个数组合并/合并为一个
【发布时间】:2019-12-17 16:27:57
【问题描述】:

我有四个数组列表:

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
    }
}

另外两个结构在结构上也很相似。

【问题讨论】:

  • 您是否已经有一个自定义结构,该结构具有属性 Product、一个 AddressInfo、另一个 Favorite 和另一个 Amount? (合并?)另外,我想您想将 products[i] 与 addressInfo[i] favorites[i] & amount[i] 合并?
  • @Larme 我刚刚编辑了我的帖子,其中包括两个结构作为示例。我只需要在最后将它们组合成一个。我没有Combined 的结构。
  • var combined = [Product/AddressInfo/Favorite/Amount]() 不清楚。能举个例子吗?
  • 结构的实际内容应该是无关紧要的——它们有自己的类型。你的意思是你想要一个可以包含异构元素的数组,例如。 [product1,product2,amount5,favourite3,amount1] 或者您是否要将它们分组为自己的实体,例如。 [combined1,combined2,combined3]其中每个Combined包含所有类型?

标签: arrays swift iphone variables merge


【解决方案1】:

假设它们的顺序相同,创建一个具有适当属性的结构

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)

【讨论】:

  • “每个人的顺序都相同”是什么意思?喜欢每个人的计数吗?如果是这样的话;它们是不相同的。一个变量的计数可以是 2,另一个是 4 或 10 或相同。
  • @Farhadam 他们认为产品、地址、收藏夹和金额之间存在 1:1:1:1 映射,它们加在一起将等于组成数组的一个组合值。查看my response 以完成您的要求。
【解决方案2】:

您可以将数组转换为 [Any] 并添加它们。

let combinedVals = (products as [Any]) + (addressInfo as [Any]) + (favorites as [Any]) + (amounts as [Any])

或者,您可以创建一个协议并让您的结构遵守它。

protocol Combined {
}
struct Amount: Combined {
    var amountsDeliveryCharge: Double
    var amountsDriverTip: Double
}
struct Product: Combined  {
    var price: Double
    var priceUnit: String
}

let combinedValues: [Combined] = amounts + products

当你遍历数组时,如果你需要检查它是什么,你可以使用一个开关来检查它的类型。

combinedValues.forEach { (value) in
    switch value {
        case let value as Amount:
            print(value.amountsDriverTip)
        break
        case let value as Product:
            print(value.price)
        break
    default:
        break
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2015-11-11
    • 2017-01-11
    • 1970-01-01
    • 2021-07-16
    • 2017-10-04
    • 2018-04-19
    相关资源
    最近更新 更多