Я разрабатываю приложение для покупок, в котором пользователь может добавлять новые товары из каталога или изменять существующие товары в корзине.
Вот проблема: когда я добавляю элементы в cart
, я добавляю элементы к двум вещам: объекту cart
и realm
. Я думаю, что этот дизайн вызывает большую избыточность, так как я чувствую, что могу просто добавить элемент в область и заставить cart
обновлять себя динамически при каждом изменении или наоборот.
Есть идеи, как мне структурировать свой код, чтобы избавиться от избыточности?
Мой код выглядит следующим образом:
Из каталога:
@IBAction func addToCart(_ sender: UIBarButtonItem) {
let itemToAdd = product
let existingIndex = cart.containsAtIndex(product!)
// If item from catalogue exist in cart, then modify
if (existingIndex >= 0) {
cart.changeItem(existingIndex, newItem: itemToAdd!)
modifyCart(product: itemToAdd!)
}
// If item is not found in cart, then add a new one
else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let controller = storyboard.instantiateViewController(withIdentifier: "CartTableView") as? CartTableViewController {
let newIndexPath = IndexPath(row: cart.numberOfItems(), section: 0)
cart.addItem(itemToAdd!)
controller.tableView.insertRows(at: [newIndexPath], with: .automatic)
saveToCart(product: itemToAdd!, update: true)
}
}
self.navigationController?.popViewController(animated: true)
self.dismiss(animated: true, completion: nil)
}
private func saveToCart(product: Product, update: Bool) {
let realm = try! Realm()
print(product)
try! realm.write {
realm.add(product, update: true)
}
}
private func modifyCart(product: Product) {
let prodName = product.itemName
let realm = try! Realm()
try! realm.write {
let item = realm.objects(Product.self).filter("itemName = %@", prodName).first
item!.quantity = product.quantity
}
}
Класс корзины:
class Cart: NSObject {
static let myCart = Cart()
private var products: [Product]
private override init() {
self.products = []
}
func getCartItems() -> [Product] {
return products
}
func getItem(_ index: Int) -> Product? {
if products.indices.contains(index) {
return products[index]
} else {
return nil
}
}
func addItem(_ item: Product) {
products.append(item)
}
func removeItem(_ index: Int) {
products.remove(at: index)
}
func numberOfItems() -> Int {
return products.count
}
func changeItem(_ index: Int, newItem: Product) {
if products.indices.contains(index) {
products[index] = newItem
}
}
func containsAtIndex(_ item: Product) -> Int {
for i in (0..<products.count) {
if (products[i].itemName == item.itemName) {
return i
}
}
return -1
}
}