Swift中的类型检查错误

时间:2019-03-18 00:53:48

标签: macos swift4

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”

如何解决?

1 个答案:

答案 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
}