在预期返回的函数中缺少返回' Double?'

时间:2018-02-10 16:00:12

标签: swift

我正在使用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
    }
}

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

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

3 个答案:

答案 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中所述。