ios 29일차

bin·2026년 2월 6일

과제에 관한 기록

기존에는 ViewController에 구매한 아이템을 담아두는 딕셔너리, InventoryViewController에서는 이를 받아서 표시할 데이터를 저장하는 배열을 선언하여 사용했었다. 이와 같이 구성하면 데이터가 변경되었을 경우 Delegate를 이용하여 원본 딕셔너리에도 적용을 해줘야 한다는 단점이 존재한다. 즉, Delegate를 두번 적용해야 한다. 이를 해결하기 위해 DataManager를 선언하여 구매한 데이터(== 인벤토리에 저장해야할 데이터)를 저장해두고 사용하였다.

import Foundation
import IdentifiedCollections

class DataManager {
    
    static let shared = DataManager()
    
    var inventoryList: IdentifiedArrayOf<PurchaseItem> = []
    func addItemToInventory(item: Item) {
        if var item = DataManager.shared.inventoryList[id: item.id] {
            item.count += 1
            DataManager.shared.inventoryList[id: item.id] = item
        } else {
            DataManager.shared.inventoryList.append(PurchaseItem(item: item, count: 1))
        }
    }
    
    var meso = Meso()
    
    var didChangeMeso: (() -> Void)?
    
    func getCurrentMeso() -> Int {
        return meso.meso
    }
    
    func addMeso(amount: Int) {
        meso.meso += amount
        didChangeMeso?()
    }
    
    func subtractMeso(amount: Int) -> Bool{
        if meso.meso >= amount{
            meso.meso -= amount
            return true
        } else {
            return false
        }
    }
}

배열과 딕셔너리를 합쳐놓은 identifiedCollections를 사용하여 구현했다. 이에 대한 설명은 다음주에 자세히 하도록 하고, 기존에 사용하던 ViewController와 InventoryViewController에서 purchaseItemList와 inventoryItemList를 DataManager.shared.itemList 변경하여 적용해주면 된다.

0개의 댓글