在Swift"Tour"文档中,您可以使用以下函数构建平均一组数字的练习:
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
Run Code Online (Sandbox Code Playgroud)
我可以使用类似下面的内容来完成这项工作:
func averageOf(numbers: Double...) -> Double {
var sum: Double = 0, countOfNumbers: Double = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = sum / countOfNumbers
return result
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我必须将所有内容都作为Double进行投射以使其工作?如果我尝试使用整数,就像这样:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = sum / countOfNumbers
return result
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: Could not find an overload for '/' that accepts the supplied arguments
Jen*_*rth 39
在OP似乎知道如何代码有样子,但他明确地问,为什么它不工作的其他方式.
因此,"明确"是他正在寻找的答案的一部分:Apple在"基础知识" - >"整数和浮点转换"一章中的"语言指南"中写道:
必须明确表示整数和浮点数字类型之间的转换
小智 24
你只需要这样做:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = Double(sum) / Double(countOfNumbers)
return result
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*ark 11
您将输出分配给/类型的变量Double,因此Swift认为您要调用此函数:
func /(lhs: Double, rhs: Double) -> Double
Run Code Online (Sandbox Code Playgroud)
但是你传递它的论点不是Doubles而Swift不会进行隐式转换.
这可能会有所帮助:
func averageOf(numbers: Int...) -> Double {
var sum = 0, countOfNumbers = 0
for number in numbers {
sum += number
countOfNumbers++
}
var result: Double = Double(sum) / Double(countOfNumbers)
return result
}
Run Code Online (Sandbox Code Playgroud)
重载/运算符也可以是一个解决方案,就像在Swift 4.x中看起来像:
infix operator /: MultiplicationPrecedence
public func /<T: FixedWidthInteger>(lhs: T, rhs: T) -> Double {
return Double(lhs) / Double(rhs)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46569 次 |
| 最近记录: |