我如何在函数中解开打印返回的可选内容练习

问题描述

嗨,我正在尝试使用《 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")
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...