使用Swift编写此代码有更好的方法吗?我使用嵌套的for循环,我想不出更好的方法来编写这段代码。我只是一个初学者试图解决这个问题。
var products = [
["product": "soap", "price": 3.50],
["product": "cereal", "price": 2.56],
["product": "soup", "price": 3.25]
]
var shoppingCart = ["soap", "cereal"]
var count = 0
var subTotal = 0.0
for product in products {
for cartItem in shoppingCart.enumerate() {
if cartItem.element == products[count]["product"] {
print(cartItem.element)
if count <= products.count {
count += 1
var cost = products[count]["price"]! as! Double
subTotal += cost
}
}
}
}
let totalCost = subTotal * 1.086
print("The total cost of your shopping cart $\(totalCost).")
答案 0 :(得分:2)
如果您将产品设置为将产品名称映射到价格的dictionary
,则可以使用reduce
来添加值:
var products = [
"soap": 3.50,
"cereal": 2.56,
"soup": 3.25
]
var shoppingCart = ["soap", "cereal"]
let totalCost = 1.086 * shoppingCart.reduce(0.0, combine: { $0 + (products[$1] ?? 0) })
注意:
0.0
开始,并在找到每个产品时添加它们的值。 $0
是运行总计,$1
依次保存购物车中的每个值。nil
。此处使用 nil coalescing operator ??
来安全地解包从字典返回的值,如果找不到产品,则使用默认价格0
。答案 1 :(得分:2)
我认为你的词典结构对你想要达到的结果不是很好。既然你没有写过你必须使用字典,我已经使用了原生的Swift类和结构来实现你需要的结果。从长远来看,它更容易测试,维护和使用。
首先定义Product
类:
class Product {
let name: String
let price: Double
init(name: String, price: Double) {
self.name = name
self.price = price
}
}
现在创建产品的实例:
let soap = Product(name: "Soap", price: 3.5)
let cereal = Product(name: "Cereal", price: 2.56)
let soup = Product(name: "Soup", price: 3.25)
购物车(两个肥皂和一个谷物包装):
var shoppingCart = [soap, soap, cereal]
你可以通过运行来计算:
let count = shoppingCart.count // returns 3
以及小计:
var subTotal = shoppingCart.reduce(0.0, combine: {$0 + $1.price})
// Would return 9.56
请注意,我在数组上使用reduce
函数方法,以尽可能缩短计算时间,但您也可以遍历购物车并获得相同的结果。