我刚刚开始学习编码,所以我决定从 Swift 开始。我正在关注 mac 在 here 上的导览。我在计算数字总和的部分,然后它告诉您尝试执行一个计算数字平均值的函数。
func averageOf(numbers: Int...) -> Int {
var sum = 0
var total = 0
var average = 0
for number in numbers {
sum += number
total++
} **Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)**
average = sum/total
return average
}
我做错了什么(我需要学习什么才能做对)?
请您参考如下方法:
我猜你已经调用了没有参数的函数,即:
averageOf()
这对于可变参数是允许的,numbers 将是一个空数组。这将导致您尝试将未更改的总和除以未更改的总和(因为对于 numbers 中的任何元素,您不会多次循环),因此将 0 除以0,您得到一个被零除错误。
为防止出现这种情况,您可以要求用户至少提供一个数字:
func averageOf(first: Int, rest: Int...) -> Double {
var sum = first
var total = 1.0
for number in rest {
sum += number
total++
}
return Double(sum)/total
}
这样,如果您尝试不带参数调用它,就会出现编译错误。
顺便说一句,我更改了您的版本以返回 Double 而不是 Int,您可能想尝试这两个版本以了解原因。
(此技术类似于声明标准库 max 函数的方式,它至少需要 2 个参数:
func max<T : Comparable>(x: T, y: T) -> T
但有 3 个或更多的重载版本:
func max<T : Comparable>(x: T, y: T, z: T, rest: T...) -> T
第一个版本的原因不是直接切入至少需要两个存在的可变版本,然后你可以将它传递到 reduce 之类的东西中以找到集合中的最大值,例如减少(a,0,最大))
