我正在学习编码所以我决定从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
}
我做错了什么(我需要学习什么才能正确行事)?
答案 0 :(得分:3)
我猜你没有参数调用你的函数,即:
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
}
这样,如果你尝试不带参数调用它,你就会遇到编译器错误。
BTW我改变了您的版本以返回Double
而不是Int
,您可能想要尝试使用这两个版本来查看原因。
(这种技术类似于声明标准的lib 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
之类的内容以查找集合中的最大值,例如reduce(a, 0, max)
)
答案 1 :(得分:0)
对我来说,发生此错误是因为未设置隐式展开的属性。设置它可以解决问题。