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.
编译器/根据您的输入和输出参数选择运算符的实现.在您的情况下,输入参数是两个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)
| 归档时间: |
|
| 查看次数: |
14565 次 |
| 最近记录: |