【发布时间】: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 let或guard let安全地打开它。 -
据我了解,该练习不需要您在
purchase中返回未包装的可选项。您的第一个实现是正确的(忽略强制展开)。 -
“补充一点,我认为关键是如果你返回它而不是 nil,就解开价格值。”我觉得你想多了。您不需要解包价格,因为该函数无论如何都会返回一个已包装的可选项。
-
这是一个非常不切实际的练习。在现实世界中,您将创建一个包含有关一个对象的所有信息的结构????
标签: ios swift swift-optionals