Ошибки проверки типов в Swift - PullRequest
0 голосов
/ 18 марта 2019
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 до ее объявления

Как это исправить?

1 Ответ

0 голосов
/ 18 марта 2019

Я не могу воспроизвести эту проблему, но вы написали, что это довольно неловкий способ, ИМО.Вы хотите, чтобы все было 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...