Swift 预期返回的函数中缺少返回';双倍?';
我正在用Swift book苦读苹果的应用程序开发,我在Optionals部分遇到了一些问题 在访问另一个字典以返回满足条件的可选值后,我无法访问字典。返回的错误为: 预期返回“Double”的函数中缺少返回值 上面的代码哪里出了问题?我需要检查一个产品是否有库存,然后返回其价格,如果该条件评估为真Swift 预期返回的函数中缺少返回';双倍?';,swift,Swift,我正在用Swift book苦读苹果的应用程序开发,我在Optionals部分遇到了一些问题 在访问另一个字典以返回满足条件的可选值后,我无法访问字典。返回的错误为: 预期返回“Double”的函数中缺少返回值 上面的代码哪里出了问题?我需要检查一个产品是否有库存,然后返回其价格,如果该条件评估为真 还有更优雅的解决方案吗?问题仅仅是您没有在逻辑中涵盖所有情况。如果name不大于零怎么办?您的代码没有说明要做什么。因此,在这种情况下无法返回值: func priceCheck(name: Str
还有更优雅的解决方案吗?问题仅仅是您没有在逻辑中涵盖所有情况。如果
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
}
}
听编译程序。它知道的比你知道的多。作为一个非常快速的解决方案,你所要做的就是在函数末尾添加
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
}
因为在某个点(name不大于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,则没有必要为每个
If
添加else{return nil}
;或者您甚至可以使用guard
语句来实现中提到的功能。通过利用Swift提供的一些工具,您的功能可以大大缩短。在这里,看一看,这做同样的事情
func priceCheck(name: String) -> Double? {
guard let stockAmount = stock[name],
stockAmount > 0,
let price = prices[name] else {
return nil
}
return price
}
如果要在末尾添加一个“catch all”
return nil
,那么我建议删除所有冗余的else{return nil}
语句。只有返回真实值的返回pricefinder
,并在最后返回一个“catch all”。是的@rmaddy,这正是我在更新中提到的:)OP的代码还有一些其他令人困惑的地方,需要进行一些清理。函数的参数被称为name
,但是如果let,则在第一个中引入一个新的name
常量。由于第二个名称
常数混乱,因此不必要从原始参数复制pricefinder
。您只需返回prices[pricefinder]
并反转条件:guard let name=stock[name],name>0 else{return nil}
即不需要prices[name]
展开,您可以直接返回价格[name]
。我的回答中提到了另一种方法:)@Sulthan true。我猜这取决于OP想要如何处理丢失的价格。但是是的,你是对的:-)谢谢@Fogmeister这真的很好。我刚刚查阅了这本书,书中有一整节介绍了如何使用带选项的guard,这有助于我理解这一概念。@RhysEdwards不用担心。很乐意帮忙。永远不要停止学习:-)
func priceCheck(name: String) -> Double? {
guard let stockAmount = stock[name],
stockAmount > 0,
let price = prices[name] else {
return nil
}
return price
}