我有一个简短的问题让我感到困惑。我做了一个简单的平均函数,它采用了一系列可选的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
}
我知道这很简单,但我想理解它。
答案 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