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.
我应该在这做什么?
答案 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并不像我们习惯的那样在值类型之间进行隐式转换,因此sum
和i
变量的任何产品都会与它们具有相同的类型。您已将其隐式定义为Int
,因此您需要在最终计算期间投射其类型,如下所示:
return Double(sum) / Double(i)