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

时间:2014-06-12 09:36:40

标签: swift

Swift "Tour" documentation中,您可以使用以下函数构建平均一组数字的练习:

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

我可以使用以下内容来完成这项工作:

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
}

我的问题是,为什么我必须将所有内容都投射为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
}

我收到以下错误:Could not find an overload for '/' that accepts the supplied arguments

8 个答案:

答案 0 :(得分:39)

OP似乎知道 代码的样子,但他明确要求为什么它不会以其他方式工作。

所以,"明确"是他正在寻找的答案的一部分:Apple在" Language Guide"在章节"基础知识" - > "整数和浮点转换":

  

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

答案 1 :(得分:23)

你只需要这样做:

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
}

答案 2 :(得分:11)

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

func /(lhs: Double, rhs: Double) -> Double

但是你传递它的论点不是Double s而Swift不会进行隐式转换。

答案 3 :(得分:5)

可能有所帮助:

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
}

OR

重载/运算符也可以是一个解决方案,就像在Swift 4.x中看起来一样:

infix operator /: MultiplicationPrecedence
public func /<T: FixedWidthInteger>(lhs: T, rhs: T) -> Double {
    return Double(lhs) / Double(rhs)
}

答案 4 :(得分:3)

我没有发现强迫分裂的必要性。普通分部操作员工作。 在以下代码中,

func average(numbers:Int...)->Float{
    var sum = 0
    for number in numbers{
        sum += number
    }
    var average: Float = 0
    average = (Float (sum) / Float(numbers.count))
    return average
}
let averageResult = average(20,10,30)
averageResult

这里,两个浮点值被分割,当然在类型转换后,因为我将结果存储在float变量中并返回相同的值。

注意:我没有使用额外的变量来计算参数的数量。 “数字”被视为数组,因为Swift中的函数将可变数量的参数带入数组。 “numbers.count”(与Objective C类似)将返回传递的参数的计数。

答案 5 :(得分:1)

试试这个但是注意swift不喜欢除以初始化为零或可能变为零的整数,所以你必须使用&amp; /来强制除法。这段代码有点冗长,但很容易理解,它给出了整数而非浮点或双精度的正确答案

func sumOf(numbers: Int...) -> Int {
var sum = 0
var i = 0
var avg = 1
for number in numbers {
    sum += number
    i += 1
}
avg = sum &/ i
return avg
}
sumOf()
sumOf(42, 597, 12)

答案 6 :(得分:1)

当您可以直接获取参数时,没有理由手动跟踪参数的数量。

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    let average = sum &/ numbers.count
    return average
}

sumOf()
sumOf(42, 597, 12)

答案 7 :(得分:1)

聚会晚了,但是原因是因为在Swift中分割两个INT时,结果始终是INT。

编译器通过截断小数点后的值(即5/2 = 2;实际结果应为2.5)来实现此目的。

要获取真实的平均值(非截断值),您需要将其强制转换为Double,以便保留小数点后的值。否则,它将丢失。