使用Swift将int分为双打

时间:2014-06-04 05:52:43

标签: 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.

我应该在这做什么?

3 个答案:

答案 0 :(得分:19)

如果你想要返回一个Double,你应该在你的函数中处理双打。将sum和i更改为Doubles(0.0 vs 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

这里,常量3的值用于创建Double类型的新值,以便添加的两侧具有相同的类型。如果没有这种转换,就不允许添加。

对于浮点数到整数转换,反之亦然,因为可以使用Double或Float值初始化整数类型:

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

当用于以这种方式初始化新的整数值时,浮点值总是被截断。这意味着4.75变为4,-3.9变为-3。

答案 1 :(得分:13)

这是一个改进的答案,使用闭合的友好力量:

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

答案 2 :(得分:10)

Swift并不像我们习惯的那样在值类型之间进行隐式转换,因此sumi变量的任何产品都会与它们具有相同的类型。您已将其隐式定义为Int,因此您需要在最终计算期间投射其类型,如下所示:

return Double(sum) / Double(i)