2016-06-05 3 views
0

Есть ли лучший способ написать этот код, используя Swift? Я использую цикл вложенных циклов, и я не мог придумать лучшего способа написать этот код. Я просто начинающий, пытающийся понять это.Расчет промежуточных итогов и итогов из словаря

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

Ваша структура данных неадекватна - скорее всего, вы должны использовать массив 'Product' structs или словарь, сопоставляющий какой-либо идентификатор продукта (имена прекрасно, если они уникальны) в структуру' Product' (или просто цена, если это единственное свойство). В этом случае словарь будет хорош для быстрого поиска. – Hamish

+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. СНИЖЕНИЯ начинается с начальным значением 0.0 и добавляет значение каждого из продуктов по мере их нахождения. $0 - это общая сумма, а $1 хранит каждое из значений в корзине покупок.
  2. Если у вас есть продукт в вашей корзине, у которого нет указанной цены, то словарь поиска вернет nil. Оператор nil coalescing?? используется здесь для безопасного восстановления возвращаемого значения из словаря и использования цены по умолчанию 0, если продукт не найден.
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 функциональный метод на массив, чтобы сделать вычисление по возможности коротким, но вы можете также цикл через корзину и получить такой же результат.

Смежные вопросы