使用reduce

时间:2015-08-29 00:42:17

标签: swift

我有一个简短的问题让我感到困惑。我做了一个简单的平均函数,它采用了一系列可选的Ints。我检查以确保数组不包含nil值但是当我使用reduce时我必须强制解包闭包中的两个元素之一。为什么我只强制解开第二个(在我的情况下是1美元!)

func average2(array: [Int?]) -> Double? {
    let N = Double(array.count)
    guard N > 0 && !array.contains({$0 == nil}) else {
        return nil
    }

    let sum = Double(array.reduce(0) {$0+$1!})
    let average = sum / N
    return average
}

我知道这很简单,但我想理解它。

1 个答案:

答案 0 :(得分:1)

0的第一个参数是总和,它在开头是Int。第二个是数组的当前元素,它是一个可选的var sum = 0 // Your starting value (an Int) for elem in array { sum = sum + elem! // This is the $0 + $1! } ,因此必须解包。

您对reduce的调用会这样做:

func average(array: [Int?]) -> Double? {
    guard !array.isEmpty else { return nil }
    let nonNilArray = array.flatMap{ $0 }
    guard nonNilArray.count == array.count else { return nil }
    return Double(nonNilArray.reduce(0, combine: +)) / Double(nonNilArray.count)
}

编辑:我无法获得比这更有效的方法:

guard

如果您希望average([1, 2, nil])之类的内容返回1.5而不是nil

,您也可以放弃第二个{{1}}