为什么我不能快速划分整数?

Jac*_*mes 30 swift

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在"基础知识" - >"整数和浮点转换"一章中的"语言指南"中写道:

必须明确表示整数和浮点数字类型之间的转换

  • 是的,谢谢,这正是我所追求的.直觉上,我希望如果我将结果(变量_或_返回值)转换为Double,那我就告诉编译器要做什么.我还没有读到语言指南,所以我不知道. (2认同)

小智 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)

  • 这仍然是不正确的实施. (2认同)

Jos*_*ark 11

您将输出分配给/类型的变量Double,因此Swift认为您要调用此函数:

func /(lhs: Double, rhs: Double) -> Double
Run Code Online (Sandbox Code Playgroud)

但是你传递它的论点不是Doubles而Swift不会进行隐式转换.


hol*_*lex 6

这可能会有所帮助:

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)