在Swift中没有这样的隐式转换,所以你必须自己明确地转换它:
average = Double(total) / Double(numbers.count)
来自Swift编程语言:"值永远不会被隐式转换为另一种类型."(章节:快速游览)
但是你现在使用的是Swift,而不是Objective-C,所以试着以更加功能的方式思考.你的功能可以像这样写:
func getAverage(numbers: Int...) -> Double { let total = numbers.reduce(0, combine: {$0 + $1}) return Double(total) / Double(numbers.count) }
reduce
将第一个参数作为累加器变量的初始值,然后将该combine
函数应用于累加器变量和数组中的每个元素.在这里,我们传递一个匿名函数,该函数使用$0
和$1
表示它传递的第一个和第二个参数并将它们相加.
更简洁,你可以这样写:numbers.reduce(0, +)
.
请注意类型推断是如何做到仍然发现这total
是一个很好的工作Int
.
编译器/
根据您的输入和输出参数选择运算符的实现.在您的情况下,输入参数是两个Int
值,输出参数是Double
.这是编译器正在寻找的:
func / (left: Int, right: Int) -> Double
但是,没有/
运算符的这种实现,这就是你得到错误的原因.执行此操作时Double(total/numbers.count)
,输出参数将更改为Int
编译器为/
存在的运算符选择以下实现的原因:
func / (left: Int, right: Int) -> Int
这就是为什么你得到的结果,4
而不是4.5
结果,即使你把结果转换成Double
后来.
您可以提供自己的/
运营商实施,首先将您的号码转换为Double
s:
func / (left: Int, right: Int) -> Double { return Double(left) / Double(right) }
然后,您可以执行以下操作:
let a: Int = 3 let b: Int = 2 let c: Double = a/b // -> 1.5
在Swift中没有这样的隐式转换,所以你必须自己明确地转换它:
average = Double(total) / Double(numbers.count)
来自Swift编程语言:"值永远不会被隐式转换为另一种类型."(章节:快速游览)
但是你现在使用的是Swift,而不是Objective-C,所以试着以更加功能的方式思考.你的功能可以像这样写:
func getAverage(numbers: Int...) -> Double { let total = numbers.reduce(0, combine: {$0 + $1}) return Double(total) / Double(numbers.count) }
reduce
将第一个参数作为累加器变量的初始值,然后将该combine
函数应用于累加器变量和数组中的每个元素.在这里,我们传递一个匿名函数,该函数使用$0
和$1
表示它传递的第一个和第二个参数并将它们相加.
更简洁,你可以这样写:numbers.reduce(0, +)
.
请注意类型推断是如何做到仍然发现这total
是一个很好的工作Int
.