Я хочу использовать «магазин» не только в «do catch», как я могу это сделать?

#swift

Вопрос:

этот код работает везде, кроме «магазина».

 enum PossibleErrors: Error {
    case notInStock
    case notEnoughMoney
}
    
struct Item {
    var price: Int
    var count: Int
}

protocol forShop {
    func buyGood(withName name: String) throws -> Item
}

class Shop: forShop {
    var moneyInBank : Int
    var stocks = ["Item1" : Item(price: 13, count: 4),"Item2" : Item(price: 12, count: 1), "Item3" : Item(price: 10, count: 0), "Item4" : Item(price: 50, count: 12)]
    
    init(moneyInBank: Int) throws {
        self.moneyInBank = moneyInBank
        if moneyInBank <= 9  {
            throw PossibleErrors.notEnoughMoney
        }
    }
}

extension Shop {
    func buyGood(withName name: String) throws -> Item {
        guard var Item = stocks[name] else {
            throw PossibleErrors.notInStock
        }
        guard Item.count > 0 else {
            throw PossibleErrors.notInStock
        }
        guard moneyInBank >= Item.price else {
            throw PossibleErrors.notEnoughMoney
        }
        moneyInBank -= Item.price
        Item.count -= 1
        return Item
    }
}

do {
    let shop = try Shop(moneyInBank: 8)
} catch PossibleErrors.notEnoughMoney {
    print("Work harder to buy it!")
}
do {
    try shop.buyGood(withName: "Item4")
} catch PossibleErrors.notInStock {
    print("Shop hasn't any")
} catch PossibleErrors.notEnoughMoney {
    print("Work harder to buy it!")
}
 

скажите мне, пожалуйста, как я могу это исправить. спасибо
, что сказали мне, что кода слишком много, но я действительно не знаю, как это исправить. помогите мне, пожалуйста
, омг, что я могу сделать, чтобы опубликовать это. стек дает му «в основном код», но лол, все это необходимо для понимания

Комментарии:

1. Не могли бы вы удалить весь ненужный текст в конце и объяснить, в чем проблема? Кроме того, это то, что вы запускаете на игровой площадке, или это реальный проект/приложение, потому что если это последнее, то ваш код do/catch неуместен

2. Я хотел бы удалить, но стек не позволяет мне этого сделать. да, это детская площадка. вопрос в следующем: как использовать переменную «магазин» вне цикла do catch. Например, могу ли я сослаться на это ?

3. Вы можете заменить его каким-нибудь более осмысленным текстом, например, лучшим объяснением проблемы. Если вы хотите использовать shop вне do/catch, объявите его перед do

4. Хорошо. Большое спасибо!

5. ты что, хотел так поступить со Смитом ? пусть магазин = попробуйте магазин(moneyInBank: 8) сделайте { магазин}, чтобы поймать возможные ошибки.notEnoughMoney { печать(«Работайте усерднее, чтобы купить это!») }

Ответ №1:

Ищу что-то вроде:

 struct Item: Hashable {
    var name: String
    var price: Int
}

class Shop {
    enum PossibleErrors: Error { case notInStock, notEnoughMoney }
    var stock: [Item: Int] = [ 
        // switched to item(name, price):quantity because that
        // is a better conceptual match for real stock records
        // than name:item(price, quantity)
        Item(name: "Item1", price: 13): 4,
        Item(name: "Item2", price: 12): 1,
        Item(name: "Item3", price: 10): 0,
        Item(name: "Item4", price: 50): 12,
    ]
    var balance: Int
    
    init(balance: Int) throws {
        self.balance = balance
        if balance <= 9  {
            throw PossibleErrors.notEnoughMoney
        }
    }
    
    func buyItem(named name: String) throws -> Item {
        // check over everything in stock
        for (item, quantity) in stock {
            // if this is the one you're looking for
            if (item.name == name amp;amp; quantity > 0) {
                // if you have enough money, buy it
                if (balance > item.price) {
                    balance -= item.price
                    stock[item]? -= 1
                    return item
                }
                // if you don't have enough money
                throw PossibleErrors.notEnoughMoney
            }
        }
        // if it doesn't exist or there are 0 in stock
        throw PossibleErrors.notInStock
    }
}

do {
    let shop = try Shop(balance: 100)
    // this loop has to be nested in the other do-try-catch
    // or else the `shop` variable doesn't exist for sure
    do {
        let boughtItems = try shop.buyItem(named: "Item4")
        print("Bought: (boughtItems)")
    } catch Shop.PossibleErrors.notInStock {
        print("Shop hasn't any")
    }
} catch Shop.PossibleErrors.notEnoughMoney {
    print("Work harder to buy it!")
}