为什么可以';我不能用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
值,然后再应用任何操作数。