在Swift "Tour" documentation中,您可以使用以下函数构建平均一组数字的练习:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
我可以使用以下内容来完成这项工作:
func averageOf(numbers: Double...) -> Double {
var sum: Double = 0, countOfNumbers: Double = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = sum / countOfNumbers
return result
}
我的问题是,为什么我必须将所有内容都投射为Double才能使其正常工作?如果我尝试使用整数,就像这样:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = sum / countOfNumbers
return result
}
我收到以下错误:Could not find an overload for '/' that accepts the supplied arguments
答案 0 :(得分:39)
OP似乎知道 代码的样子,但他明确要求为什么它不会以其他方式工作。
所以,"明确"是他正在寻找的答案的一部分:Apple在" Language Guide"在章节"基础知识" - > "整数和浮点转换":
整数和浮点数字类型之间的转换必须是 明确
答案 1 :(得分:23)
你只需要这样做:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = Double(sum) / Double(countOfNumbers)
return result
}
答案 2 :(得分:11)
您正在将/
的输出分配给Double
类型的变量,因此Swift认为您想要调用此函数:
func /(lhs: Double, rhs: Double) -> Double
但是你传递它的论点不是Double
s而Swift不会进行隐式转换。
答案 3 :(得分:5)
可能有所帮助:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = Double(sum) / Double(countOfNumbers)
return result
}
重载/
运算符也可以是一个解决方案,就像在Swift 4.x中看起来一样:
infix operator /: MultiplicationPrecedence
public func /<T: FixedWidthInteger>(lhs: T, rhs: T) -> Double {
return Double(lhs) / Double(rhs)
}
答案 4 :(得分:3)
我没有发现强迫分裂的必要性。普通分部操作员工作。 在以下代码中,
func average(numbers:Int...)->Float{
var sum = 0
for number in numbers{
sum += number
}
var average: Float = 0
average = (Float (sum) / Float(numbers.count))
return average
}
let averageResult = average(20,10,30)
averageResult
这里,两个浮点值被分割,当然在类型转换后,因为我将结果存储在float变量中并返回相同的值。
注意:我没有使用额外的变量来计算参数的数量。 “数字”被视为数组,因为Swift中的函数将可变数量的参数带入数组。 “numbers.count”(与Objective C类似)将返回传递的参数的计数。
答案 5 :(得分:1)
试试这个但是注意swift不喜欢除以初始化为零或可能变为零的整数,所以你必须使用&amp; /来强制除法。这段代码有点冗长,但很容易理解,它给出了整数而非浮点或双精度的正确答案
func sumOf(numbers: Int...) -> Int {
var sum = 0
var i = 0
var avg = 1
for number in numbers {
sum += number
i += 1
}
avg = sum &/ i
return avg
}
sumOf()
sumOf(42, 597, 12)
答案 6 :(得分:1)
当您可以直接获取参数时,没有理由手动跟踪参数的数量。
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
let average = sum &/ numbers.count
return average
}
sumOf()
sumOf(42, 597, 12)
答案 7 :(得分:1)
聚会晚了,但是原因是因为在Swift中分割两个INT时,结果始终是INT。
编译器通过截断小数点后的值(即5/2 = 2;实际结果应为2.5)来实现此目的。
要获取真实的平均值(非截断值),您需要将其强制转换为Double,以便保留小数点后的值。否则,它将丢失。