online - swift playgrounds windows
No se pudo encontrar una sobrecarga para ''/'' que acepta los argumentos proporcionados (2)
// 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)
Me sale un error en average = total / numbers.count
No se pudo encontrar una sobrecarga para ''/'' que acepta los argumentos proporcionados
Traté de corregir haciendo:
average = Double(total/numbers.count)
pero luego el getAverage se estableció en 4
lugar de 4.5
El compilador elige una implementación del operador /
función de los parámetros de entrada y salida. En su caso, los parámetros de entrada son dos valores Int
y el parámetro de salida es Double
. Esto es lo que el compilador está buscando:
func / (left: Int, right: Int) -> Double
Sin embargo, no hay tal implementación del operador /
por lo que se obtiene el error. Cuando haces Double(total/numbers.count)
, tu parámetro de salida cambia a Int
razón por la cual el compilador elige la siguiente implementación para el operador /
que existe:
func / (left: Int, right: Int) -> Int
Es por eso que obtienes 4
lugar de 4.5
como resultado, a pesar de que luego conviertes el resultado en un Double
.
Puede proporcionar su propia implementación del operador /
que primero convierte sus números en Double
s:
func / (left: Int, right: Int) -> Double {
return Double(left) / Double(right)
}
Entonces puedes hacer lo siguiente:
let a: Int = 3
let b: Int = 2
let c: Double = a/b // -> 1.5
No hay tales conversiones implícitas en Swift, por lo que deberá convertirlas usted mismo explícitamente:
average = Double(total) / Double(numbers.count)
Del lenguaje de programación Swift : "Los valores nunca se convierten implícitamente a otro tipo". (Sección: Un recorrido rápido)
Pero ahora estás usando Swift, no Objective-C, así que intenta pensar de una manera más funcional y orientada. Su función puede escribirse así:
func getAverage(numbers: Int...) -> Double {
let total = numbers.reduce(0, combine: {$0 + $1})
return Double(total) / Double(numbers.count)
}
reduce
toma un primer parámetro como un valor inicial para una variable de acumulador, luego aplica la función de combine
a la variable de acumulador y cada elemento en la matriz. Aquí, pasamos una función anónima que usa $0
y $1
para indicar el primer y segundo parámetro que se pasa y los suma.
Aún más concisamente, puedes escribir esto: numbers.reduce(0, +)
.
Observe cómo la inferencia de tipo hace un buen trabajo al descubrir que el total
es un Int
.