//自定義錯(cuò)誤,用來(lái)表示購(gòu)物錯(cuò)誤
enum ShoppingError:Error{? // 采用了Error協(xié)議,而不是繼承自Error類(lèi),在Swift中Error是個(gè)協(xié)議名字
? ? caseGoodsNotExist(String)? ? ? //商品不存在
? ? caseGoodsNotEnough(String)? ? //庫(kù)存不足
? ? casepayNotEnough(String)? ? ? //付款金額不足
}
classShopping {? ? //表示購(gòu)物的類(lèi)
? ? //用字典存儲(chǔ)商店中所有的商品
? ? vargoodsList = ["可口可樂(lè)":(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),
?? ? ? ? ? ? ? ? ? ? ]
? ? //定義一個(gè)方法傍妒,表示售賣(mài)商品
? ? //參數(shù)1:表示購(gòu)買(mǎi)的商品名稱(chēng)
? ? //參數(shù)2:表示購(gòu)買(mǎi)的數(shù)量
? ? //參數(shù)3:表示付的金額
? ? //throws:一般用于方法定義的返回值之前竿音,表示將該方法做成一個(gè)可拋出錯(cuò)誤的方法(throwing方法)
? ? //throw:一般用于方法體內(nèi),拋出某個(gè)具體的錯(cuò)誤拢军,如果能執(zhí)行throw屯吊,后續(xù)語(yǔ)句都不會(huì)執(zhí)行送巡,該方法調(diào)用立即結(jié)束,等效于return語(yǔ)句
? ? funcbuyGoods(name:String,num:Int,pay:Double)throws->Void{
? ? ? ? guardletgoods =goodsList[name]else{
? ? ? ? ? ? //如果商品不存在盒卸,拋出“商品不存在”的錯(cuò)誤
? ? ? ? ? ? throwShoppingError.GoodsNotExist("商品不存在")
? ? ? ? }
? ? ? ? //后續(xù)語(yǔ)句都表示商品存在的情況
? ? ? ? //如果購(gòu)買(mǎi)的數(shù)量超過(guò)了商品的庫(kù)存骗爆,拋出“庫(kù)存不足”的錯(cuò)誤
? ? ? ? guardgoods.number >= numelse{
? ? ? ? ? ? throwShoppingError.GoodsNotEnough("庫(kù)存不足")
? ? ? ? }
? ? ? ? //如果付款金額不足,拋出“金額不足”的錯(cuò)誤
? ? ? ? guardpay >= (goods.price *Double(num))else{
? ? ? ? ? ? throw? ShoppingError.payNotEnough("金額不足")
? ? ? ? }
? ? ? ? //計(jì)算找零
? ? ? ? letletfMoney = pay - goods.price *Double(num)
? ? ? ? //打印清單
? ? ? ? print("\(name)? ? \(goods.price)? ? \(num)? ? \(pay)? \(letfMoney)")
? ? }
}
var s = Shopping()
do{
trys.buyGoods(name:"可口可樂(lè)", num:50, pay:200)
}catchShoppingError.GoodsNotExist{
? ? print ("商品不存在")
}catchShoppingError.GoodsNotEnough{
? ? print("庫(kù)存不足")
}catchShoppingError.payNotEnough{
? ? print("金額不足")
}