1

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

该帖子是功能和选项练习

我在这个练习中,你应该打印返回值。如果商品的库存为 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 ,但是我又回到了包装的可选项。

感谢您的任何回答

4

2 回答 2

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")!)
}
于 2020-11-03T07:21:01.323 回答
0

您不能在函数中展开。该函数返回一个可选的;那是给你的规格。

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