func cal(X: [Int], Y: [Int64]) -> Double {
let total = Double(Y.reduce(0, +))
var z = zip(X, Y).map { pow(Double($0), 2) * Double($1) }.reduce(0, +) / Double(total)
return z
}
我收到此错误
在声明“ Double”之前无法捕获
在声明之前使用局部变量“ Double”
如何解决?
答案 0 :(得分:0)
我无法重现此问题,但是您已经写出这是IMO相当尴尬的方式。您希望所有内容都为Double,因此只需将其设置为Double,然后代码就会变得更加简单,并且不需要所有的转换。 pow(x,2)
也是计算x*x
的一种非常昂贵的方法,因此我将摆脱它,并且我认为代码变得更加简单,并且绝对没有编译问题。
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.reduce(0, +)
return zip(xs, ys).map { $0*$0 * $1 }.reduce(0, +) / total
}
如果您正在处理大量此类代码,则可能会发现sum()
扩展名有助于使代码更清晰。
extension Sequence where Element: Numeric {
func sum() -> Element {
return reduce(0, +)
}
}
func cal(xs: [Int], ys: [Int64]) -> Double {
let xs = xs.lazy.map(Double.init)
let ys = ys.lazy.map(Double.init)
let total = ys.sum()
return zip(xs, ys).map { $0*$0 * $1 }.sum() / total
}