如何将重复产品标识数组转换为Product结构体实例集合?
嘿,我来帮你搞定这个需求!咱们可以通过几个简单的步骤把产品ID数组转换成统计好数量、匹配好价格的Product实例集合,具体做法如下:
第一步:先梳理基础定义
首先确保你已经有了这些基础的结构体和类定义(我稍微调整了变量名的大小写,符合Swift的命名规范):
struct Product { let id: String let quantity: Int let price: Double } class ProductPrices { internal static var pricesArray: [String: Double] = ["product1": 5.00,"product2": 5.00,"product3": 5.00] } class ProductNames { internal static var namesArray: [String: String] = ["product1": "name1","product2": "name2","product3": "name3"] }
第二步:统计每个产品的出现次数
我们可以用一个字典来累加每个产品ID的数量,遍历输入数组即可完成统计:
let inputProductIds = ["product1","product1","product2","product1","product3","product2"] // 统计数量的字典,键是产品ID,值是对应数量 var productQuantityMap: [String: Int] = [:] for id in inputProductIds { // 用default下标简化计数:如果键不存在就默认0,然后加1 productQuantityMap[id, default: 0] += 1 }
第三步:生成Product实例集合
遍历统计好的字典,结合ProductPrices里的价格数据,创建每个Product实例:
var finalProducts: [Product] = [] for (productId, quantity) in productQuantityMap { // 安全获取价格:如果ProductPrices里没有对应ID的价格,默认用0.0避免崩溃 let matchedPrice = ProductPrices.pricesArray[productId] ?? 0.0 let product = Product(id: productId, quantity: quantity, price: matchedPrice) finalProducts.append(product) }
验证结果
你可以打印出来看看效果:
for product in finalProducts { print("产品ID: \(product.id),数量: \(product.quantity),单价: \(product.price)") }
输出会是:
产品ID: product1,数量: 3,单价: 5.0 产品ID: product2,数量: 2,单价: 5.0 产品ID: product3,数量: 1,单价: 5.0
额外小补充
如果需要把Product实例存到Set里(自动去重,不过这里我们已经统计过了,其实用数组足够),因为Product是结构体,且所有属性都遵守Hashable协议,所以直接让Product遵守Hashable就行(Swift会自动合成实现):
struct Product: Hashable { let id: String let quantity: Int let price: Double }
之后就可以用Set<Product>来存储了。
另外,如果需要在Product里包含产品名称,只要给结构体加个name属性,创建实例时从ProductNames.namesArray里取就行:
struct Product { let id: String let name: String let quantity: Int let price: Double } // 创建实例时 let matchedName = ProductNames.namesArray[productId] ?? "未知产品" let product = Product(id: productId, name: matchedName, quantity: quantity, price: matchedPrice)
内容的提问来源于stack exchange,提问作者Utku Dalmaz
相关产品推荐
相关产品推荐

