从字典计算小计和总计

时间:2016-06-05 13:38:17

标签: swift

使用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).")

2 个答案:

答案 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) })

注意:

  1. Reduce以初始值0.0开始,并在找到每个产品时添加它们的值。 $0是运行总计,$1依次保存购物车中的每个值。
  2. 如果购物车中的商品没有列出价格,则查找字典将返回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函数方法,以尽可能缩短计算时间,但您也可以遍历购物车并获得相同的结果。