代码之家  ›  专栏  ›  技术社区  ›  zs2020

愚蠢的类型签入Swift

  •  -1
  • zs2020  · 技术社区  · 7 年前
    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 回复  |  直到 7 年前
        1
  •  0
  •   Rob Napier    7 年前

    我不能重现这个问题,但你写这是一个相当尴尬的方式我。你想一切都是双重的,所以只要使它双重,然后代码变得更简单,你不需要所有的铸造。 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
    }