Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我不能用swift除法整型吗?_Swift - Fatal编程技术网

为什么可以';我不能用swift除法整型吗?

为什么可以';我不能用swift除法整型吗?,swift,Swift,在中,有一个练习,您可以使用以下函数对一组数字求平均值: 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,

在中,有一个练习,您可以使用以下函数对一组数字求平均值:

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
}
我的问题是,为什么我要把所有的事情都当作替身来做呢?如果我尝试使用整数,比如:

func averageOf(numbers: Int...) -> Double {
    var sum = 0, countOfNumbers = 0
    for number in numbers {
        sum += number
        countOfNumbers++
    }
    var result: Double = sum / countOfNumbers
    return result
}

我收到以下错误:
找不到接受提供的参数的“/”的重载

您只需执行以下操作:

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
}
这可能会有帮助:

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
}

或 重载
/
操作符也是一种解决方案,如Swift 4.x中所示:

infix operator /: MultiplicationPrecedence
public func /<T: FixedWidthInteger>(lhs: T, rhs: T) -> Double {
    return Double(lhs) / Double(rhs)
}
中缀运算符/:乘法优先级
公共职能/(左:T,右:T)->双{
双回程(左侧)/双回程(右侧)
}

OP似乎知道代码必须是什么样子,但他明确地问为什么它不起作用

因此,“明确”是他寻找的答案的一部分:苹果在“基础”->“整数和浮点转换”一章的“语言指南”中写道:

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


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

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

但是您传递的参数不是双精度的,Swift不会进行隐式转换。

试试看,但是请注意Swift不喜欢被初始化为零或可能变为零的整数除法,因此必须使用&/强制除法。这段代码有点冗长,但很容易理解,它给出了整数而不是浮点或双精度的正确答案

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)

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

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)

我觉得没有必要强行分开。不过,普通除法运算符可以工作。 在下面的代码中

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
这里,两个浮点值分开,当然是在类型转换之后,因为我将结果存储在一个浮点变量中并返回相同的结果

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

派对迟到了,但原因是在Swift中划分两个整数时,结果总是一个整数

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


要获得真正的平均值(非截断值),需要将其转换为双精度,以便保留小数点后的值。否则,它将丢失。

var result:Double=Double(sum)/Double(countOfNumbers)
,或者如果愿意,您可以重载运算符。您希望得到什么结果?整数截断平均值转换为double,还是将平均值转换为int为double?(即[4,3]是否应该返回3.5(7.0/2)或3(7/2)?)您应该知道,对于一些琐碎的事情,例如整数除法,您应该使用RTFM。请注意,如果您将两个
Int
类型除法,任何余数都将被丢弃(整数除法)是的,谢谢,这正是我想要的。直观地说,我希望如果我将结果(变量或返回值)转换为Double,那么我已经告诉编译器该怎么做了。我还没有深入阅读语言指南,所以我不知道。我可能在这里遗漏了一些非常明显的东西,但我发现有趣的是,当除数和除数等于整数时,Swift中的除法可以归结为正确的结果(1.0)。谢谢,这也很有帮助,我没有意识到“/”实际上,这只是一个常规函数。这对我来说是一个真正的惊喜,可能是最好的答案是一个函数,它接受两个参数,这两个参数都必须是双精度的。它解释了在进行除法之前进行强制转换的必要性,并解释了xcode产生的错误消息;考虑改变为“让”不变。在swift 5中获取此错误消息:二进制运算符“/”无法应用于两个“Double”操作数您需要先展开
Double
值,然后再应用任何操作数。