我正在使用Swift本书研究Apple的App开发,我在Optionals部分遇到了一些问题。
我在访问另一个字典后返回符合条件的可选值后,卡住了访问字典的问题。返回的错误是:
在预期返回的函数中缺少返回' 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 priceCheck(name: String) -> Double? {
let pricefinder = name
if let name = stock[name] {
print(name)
if name > 0 {
if let pricefinder = prices[pricefinder] {
print(pricefinder)
return pricefinder
} else {
return nil
}
}
} else {
return nil
}
}
上面的代码我哪里错了?我需要检查产品是否有库存,然后如果该条件评估为真,则返回其价格。
还有更优雅的解决方案吗?
答案 0 :(得分:5)
通过利用Swift为您提供的一些工具,您的功能可以缩短很多。在这里,看看,这也是一样的......
func priceCheck(name: String) -> Double? {
guard let stockAmount = stock[name],
stockAmount > 0,
let price = prices[name] else {
return nil
}
return price
}
答案 1 :(得分:2)
问题仅在于您没有涵盖逻辑中的所有情况。如果name
不大于零怎么办?您的代码没有说明要做什么。因此,在这种情况下您无法返回值:
func priceCheck(name: String) -> Double? {
let pricefinder = name
if let name = stock[name] {
print(name)
if name > 0 {
if let pricefinder = prices[pricefinder] {
print(pricefinder)
return pricefinder
} else {
return nil
}
} else { // this is the question: what if it isn't?
return nil // ???? I don't know what you want to do...
// ... but you MUST return something in this situation
}
} else {
return nil
}
}
收听编译器。它比你知道的更多。
答案 2 :(得分:2)
作为一个非常快速的解决方案,您所要做的就是在功能结束时添加return nil
:
func priceCheck(name: String) -> Double? {
let pricefinder = name
if let name = stock[name] {
print(name)
if name > 0 {
if let pricefinder = prices[pricefinder] {
print(pricefinder)
return pricefinder
} else {
return nil
}
}
} else {
return nil
}
// here we go:
return nil
}
因为在某些时候(名称不大于0),该函数不会返回任何内容。
另外,请注意您可以实现您的功能 - 更短的版本 - :
func priceCheck(name: String) -> Double? {
let pricefinder = name
if let name = stock[name], name > 0 {
if let pricefinder = prices[pricefinder] {
return pricefinder
}
}
return nil
}
如果函数在结尾处返回nil,则无法为每个else { return nil }
添加if
;或者您甚至可以使用guard
语句来实现它,如Fogmeister`s answer中所述。