with playgrounds playground online development apple app swift swift-playground

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 .