Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 预期返回的函数中缺少返回';双倍?';_Swift - Fatal编程技术网

Swift 预期返回的函数中缺少返回';双倍?';

Swift 预期返回的函数中缺少返回';双倍?';,swift,Swift,我正在用Swift book苦读苹果的应用程序开发,我在Optionals部分遇到了一些问题 在访问另一个字典以返回满足条件的可选值后,我无法访问字典。返回的错误为: 预期返回“Double”的函数中缺少返回值 上面的代码哪里出了问题?我需要检查一个产品是否有库存,然后返回其价格,如果该条件评估为真 还有更优雅的解决方案吗?问题仅仅是您没有在逻辑中涵盖所有情况。如果name不大于零怎么办?您的代码没有说明要做什么。因此,在这种情况下无法返回值: func priceCheck(name: Str

我正在用Swift book苦读苹果的应用程序开发,我在Optionals部分遇到了一些问题

在访问另一个字典以返回满足条件的可选值后,我无法访问字典。返回的错误为:

预期返回“Double”的函数中缺少返回值

上面的代码哪里出了问题?我需要检查一个产品是否有库存,然后返回其价格,如果该条件评估为真


还有更优雅的解决方案吗?

问题仅仅是您没有在逻辑中涵盖所有情况。如果
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
}