#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!")
}