找不到接受提供的参数的'/'的重载

Ari*_*osh 36 swift swift-playground

// 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)
Run Code Online (Sandbox Code Playgroud)

我收到错误 average = total / numbers.count

找不到接受提供的参数的'/'的重载

我试图修复:

average = Double(total/numbers.count)
Run Code Online (Sandbox Code Playgroud)

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

Jea*_*let 62

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

average = Double(total) / Double(numbers.count)
Run Code Online (Sandbox Code Playgroud)

来自Swift编程语言:"值永远不会被隐式转换为另一种类型."(章节:快速游览)

但是你现在使用的是Swift,而不是Objective-C,所以试着以更加功能的方式思考.你的功能可以像这样写:

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

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

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

请注意类型推断是如何做到仍然发现这total是一个很好的工作Int.


Tom*_*Tom 6

编译器/根据您的输入和输出参数选择运算符的实现.在您的情况下,输入参数是两个Int值,输出参数是Double.这是编译器正在寻找的:

func / (left: Int, right: Int) -> Double
Run Code Online (Sandbox Code Playgroud)

但是,没有/运算符的这种实现,这就是你得到错误的原因.执行此操作时Double(total/numbers.count),输出参数将更改为Int编译器为/存在的运算符选择以下实现的原因:

func / (left: Int, right: Int) -> Int
Run Code Online (Sandbox Code Playgroud)

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

您可以提供自己/运营商实施,首先将您的号码转换为Doubles:

func / (left: Int, right: Int) -> Double {
    return Double(left) / Double(right)
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以执行以下操作:

let a: Int = 3
let b: Int = 2
let c: Double = a/b  // -> 1.5
Run Code Online (Sandbox Code Playgroud)