Разделите ints на двойные с помощью Swift

func avg(numbers: Int...) -> Double {
    var sum = 0;
    var i = 0;
    for number in numbers {
        sum += number;
        ++i;
    }
    return sum / i;
}
avg(42, 597, 12);

Линия return sum / i приводит к ошибке Could not find an overload for '/' that accepts the supplied arguments.

Что я должен делать здесь?

Ответ 1

Если вы хотите вернуть Double, вы должны иметь дело с удвоением в своей функции. Измените сумму и я на пары (0.0 против 0) и преобразуйте каждое число в double. Вот так:

func avg(numbers: Int...) -> Double {
    var sum = 0.0; //now implicitly a double
    var i = 0.0;
    for number in numbers {
        sum += Double(number); //converts number to a double and adds it to sum. 
        ++i;
    }
    return sum / i;
}
avg(42, 597, 12);

Целое число и преобразование с плавающей запятой

Конверсии между целыми числами и числовыми типами с плавающей запятой должны быть явными:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double

Здесь значение константы три используется для создания нового значения типа Double, так что обе стороны сложения одного типа. Без этого преобразования это не будет разрешено.

Обратное также верно для преобразования с плавающей точкой в ​​целое, поскольку целочисленный тип может быть инициализирован с помощью значения Double или Float:

let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int

Значения с плавающей запятой всегда усекаются при использовании для инициализации нового целочисленного значения таким образом. Это означает, что 4.75 становится 4, а -3.9 становится -3.

Ответ 2

Здесь улучшенный ответ, используя дружественную силу замыканий:

func avg(numbers: Int...) -> Double {
    return Double(numbers.reduce(0, +)) / Double(numbers.count)
}

Ответ 3

Swift не подразумевает конвертацию между типами значений, например, мы привыкли, поэтому любой продукт ваших переменных sum и i будет иметь тот же тип, что и они. Вы позволили им неявно быть определенными как Int, поэтому вам нужно будет указать их тип во время окончательного вычисления, например:

return Double(sum) / Double(i)