无法find接受提供参数的“/”的重载

// Playground - noun: a place where people can play func getAverage(numbers: Int...) -> Double{ var total = 0 var average:Double = 0 for number in numbers{ total = total + number } average = total / numbers.count return average } getAverage(3, 6) 

我得到一个average = total / numbers.count错误

无法find接受提供参数的“/”的重载

我试图通过这样做来解决:

 average = Double(total/numbers.count) 

但是然后getAverage被设置为4而不是4.5

在Swift中没有这样的隐式转换,所以你必须自己明确地转换它:

 average = Double(total) / Double(numbers.count) 

Swift编程语言 :“值永远不会被隐式转换为另一种types”(Section:Swift Tour)

但是现在你正在使用Swift,而不是Objective-C,所以试着以一种更加function化的方式思考。 你的function可以这样写:

 func getAverage(numbers: Int...) -> Double { let total = numbers.reduce(0, combine: {$0 + $1}) return Double(total) / Double(numbers.count) } 

reduce将第一个参数作为累加器variables的初始值,然后将combine函数应用于累加器variables和数组中的每个元素。 在这里,我们传递一个使用$0$1的匿名函数来表示它传递的第一个和第二个参数,并将它们加起来。

更简洁地说,你可以这样写: numbers.reduce(0, +)

请注意types推断如何确定total是否为Int

编译器根据您的input和输出参数select/运算符的实现。 在你的情况下,input参数是两个Int值,输出参数是Double 。 这是编译器正在寻找的东西:

 func / (left: Int, right: Int) -> Double 

但是,没有这样的/运算符的这种实现,这就是为什么你得到错误。 当你做Double(total/numbers.count) ,你的输出参数变为Int ,这就是为什么编译器为存在的/运算符select下面的实现:

 func / (left: Int, right: Int) -> Int 

这就是为什么你得到4而不是4.5的结果,即使你把结果转换成后来的结果。

你可以提供你自己/运算符的实现 ,它首先把你的数字转换成Double s:

 func / (left: Int, right: Int) -> Double { return Double(left) / Double(right) } 

然后你可以做到以下几点:

 let a: Int = 3 let b: Int = 2 let c: Double = a/b // -> 1.5