36 votes

Impossible de trouver une surcharge pour '/' qui accepte les arguments fournis

 // 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)
 

Je reçois une erreur sur average = total / numbers.count

Impossible de trouver une surcharge pour '/' qui accepte les arguments fournis

J'ai essayé de réparer en faisant:

 average = Double(total/numbers.count)
 

mais alors getAverage a été défini sur 4 au lieu de 4.5

62voto

Jean-Philippe Pellet Points 25240

Il n'y a pas de telles conversions implicites dans Swift, de sorte que vous aurez à convertir explicitement que vous-même:

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

À partir de La Swift Langage de Programmation: "les Valeurs ne sont jamais implicitement converti en un autre type." (Article: Un Rapide Tour)

Mais vous êtes maintenant en utilisant Swift, pas Objective-C, alors essayez de penser en plus fonctionnelle et orientée de façon. Votre fonction peut être écrit comme ceci:

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

reduce prend en premier paramètre une valeur initiale d'une variable accumulateur, puis applique l' combine de la fonction à la variable accumulateur et chaque élément dans le tableau. Ici, nous passons une fonction anonyme qui utilise $0 et $1 , pour désigner le premier et le second les paramètres de celui-ci est transmis et les ajoute en place.

Même de façon plus concise, vous pouvez écrire ceci: numbers.reduce(0, +).

Notez comment l'inférence de type fait un excellent travail de toujours trouver que total est Int.

6voto

Tom Points 1176

Le compilateur choisit une mise en œuvre de l' / opérateur basée sur vos données et paramètres de sortie. Dans votre cas, les paramètres d'entrée sont deux Int valeurs et le paramètre de sortie est - Double. C'est ce que le compilateur est à la recherche de:

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

Cependant, il n'existe pas de mise en œuvre de l' / - opérateur qui est pourquoi vous obtenez le message d'erreur. Lorsque vous effectuez Double(total/numbers.count), votre paramètre de sortie des changements d' Int c'est pourquoi le compilateur détermine la suite de la mise en œuvre de l' / - opérateur qui existe:

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

C'est pourquoi vous obtenez 4au lieu de 4.5 comme un résultat, même si vous convertir le résultat en Double par la suite.

Vous pouvez fournir votre propre mise en œuvre de l' / - opérateur qui convertit vos numéros en Doubles:

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

Ensuite, vous pouvez effectuer les opérations suivantes:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X