【问题标题】:How do I unwrap a printed returned optional in a function (exercise)如何在函数中解开打印的返回选项(练习)
【发布时间】:2021-02-15 20:37:12
【问题描述】:

您好,我正在尝试使用 Apples Fundamentals of Swift 这本书来学习 Swift。 过去有过类似的帖子,但我对答案有一些问题,我想澄清一下。

帖子是Functions and optionals exercise

我在这个练习中,你应该打印返回值。如果商品的库存为 0,则返回值为 nil,如果库存不为 0,则返回值为 nil。补充一点,我认为关键是如果您返回它而不是 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, "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]

func purchase(item: String) -> Double? {
    stock[item]! == 0 ? nil : prices[item]
}
    
print(purchase(item: "Chips"))

如果我 print(purchases(item: "Chips") 我会打印 optional(2.99)。如果它被打开,它不会只是 2.99?我可以在调用函数并强制打开包装时作弊,但这会破坏点。

当我尝试安全地打开包装时,我收到一条消息“在预期返回 'Double 的函数中缺少返回?'”

这样:

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]

func purchase(item: String) -> Double? {
    if stock[item]! == 0 {
        return nil
    } else {
        if let itemPrice = prices[item] {
            return itemPrice
        }
    }
}

我可以在 if let 语句之后添加另一个 else return nil,但是我又回到了包装的可选项。

感谢您的任何回答

【问题讨论】:

  • 如果你返回Double而不是Double?,那么它将在没有optional的情况下打印,但你必须使用if letguard let安全地打开它。
  • 据我了解,该练习不需要您在 purchase 中返回未包装的可选项。您的第一个实现是正确的(忽略强制展开)。
  • “补充一点,我认为关键是如果你返回它而不是 nil,就解开价格值。”我觉得你想多了。您不需要解包价格,因为该函数无论如何都会返回一个已包装的可选项。
  • 这是一个非常不切实际的练习。在现实世界中,您将创建一个包含有关一个对象的所有信息的结构????

标签: ios swift swift-optionals


【解决方案1】:

有很多方法可以解开一个值。你可以试试这些方法。

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

【讨论】:

    【解决方案2】:

    你不能在函数中解包。该函数返回一个可选的;这是给你的规格。

    由于该函数返回一个可选项,因此您不能简单地打印返回值(嗯,可以,但您会得到 "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")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多