问题描述
嗨,我正在尝试使用《 Apples Swift基础》一书来学习Swift。 过去也有过类似的帖子,但是我想弄清楚我的答案有一些问题。
帖子为Functions and optionals exercise
我正在本练习中,您应该在其中打印返回值。如果该项目的库存为0,则返回值为nil;如果库存不为0,则返回值为价格。总之,我认为,要是返回而不是nil,则要解开价格值。在较早的练习中,他们让我们打开了选装件。
var prices = ["Chips": 2.99,"Donuts": 1.89,"Juice": 3.99,"Apple": 0.50,"Banana": 0.25,"Broccoli": 0.99]
var stock = ["Chips": 4,"Donuts": 0,"Juice": 12,"Apple": 6,"Banana": 6,"Broccoli": 3]
var prices = ["Chips": 2.99,"Broccoli": 3]
func purchase(item: String) -> Double? {
stock[item]! == 0 ? nil : prices[item]
}
print(purchase(item: "Chips"))
如果我打印(购买(项目:“筹码”),我会打印可选的(2.99)。如果将其拆开,会不会是2.99?我可以在调用该函数时作弊并强制拆开,但这会破坏点。
当我尝试安全地解开包装时,我收到一条消息,提示“在预期返回“ Double?”的函数中缺少返回值”
如此:
var prices = ["Chips": 2.99,"Broccoli": 3]
func purchase(item: String) -> Double? {
if stock[item]! == 0 {
return nil
} else {
if let itemPrice = prices[item] {
return itemPrice
}
}
}
我可以在if let语句之后添加另一个else返回nil,但是然后我又回到了包装好的可选内容。
感谢您的回答
解决方法
有很多方法可以解开值。您可以尝试这些方式。
1。第一种方式:
guard let value = purchase(item: "Chips") else { return }
print(value)
2。第二种方式:
if let value = purchase(item: "Chips"){
print(value)
}
3。第三种方式:
if (purchase(item: "Chips") != nil){
print(purchase(item: "Chips")!)
}
,
您无法打开该功能。该函数返回一个可选;这就是您得到的说明。
由于该函数返回一个可选值,所以不能简单地打印返回值(可以,但是会得到“ optional(2.99)”)。
首先,您可以重新编写函数以避免强制展开(规范中规定您应传递字典中的字符串,但在防御性代码方面总是个好选择)。
func purchase(item: String) -> Double? {
if let qty = stock[item],qty > 0,price = prices[item] {
return price
}
return nil
}
然后您可以使用该功能
if let price = purchase("chips") {
print("Purchased for $\(price)")
} else {
print("None in stock")
}