//自定义错误,用来表示购物错误
enum ShoppingError:Error{ // 采用了Error协议,而不是继承自Error类,在Swift中Error是个协议名字
caseGoodsNotExist(String) //商品不存在
caseGoodsNotEnough(String) //库存不足
casepayNotEnough(String) //付款金额不足
}
classShopping { //表示购物的类
//用字典存储商店中所有的商品
vargoodsList = ["可口可乐":(price:3.5,number:100),
"士力架":(price:4.5,number:50),
"可比克薯片":(price:3.5,number:200),
"糯米滋":(price:0.75,number:100),
"双汇火腿肠":(price:1.5,number:150),
]
//定义一个方法,表示售卖商品
//参数1:表示购买的商品名称
//参数2:表示购买的数量
//参数3:表示付的金额
//throws:一般用于方法定义的返回值之前,表示将该方法做成一个可抛出错误的方法(throwing方法)
//throw:一般用于方法体内,抛出某个具体的错误,如果能执行throw,后续语句都不会执行,该方法调用立即结束,等效于return语句
funcbuyGoods(name:String,num:Int,pay:Double)throws->Void{
guardletgoods =goodsList[name]else{
//如果商品不存在,抛出“商品不存在”的错误
throwShoppingError.GoodsNotExist("商品不存在")
}
//后续语句都表示商品存在的情况
//如果购买的数量超过了商品的库存,抛出“库存不足”的错误
guardgoods.number >= numelse{
throwShoppingError.GoodsNotEnough("库存不足")
}
//如果付款金额不足,抛出“金额不足”的错误
guardpay >= (goods.price *Double(num))else{
throw ShoppingError.payNotEnough("金额不足")
}
//计算找零
letletfMoney = pay - goods.price *Double(num)
//打印清单
print("\(name) \(goods.price) \(num) \(pay) \(letfMoney)")
}
}
var s = Shopping()
do{
trys.buyGoods(name:"可口可乐", num:50, pay:200)
}catchShoppingError.GoodsNotExist{
print ("商品不存在")
}catchShoppingError.GoodsNotEnough{
print("库存不足")
}catchShoppingError.payNotEnough{
print("金额不足")
}