2015-01-03 4 views
1

Я просто изучаю код, поэтому решил начать с Swift. Я следую за гастролями, которые у него есть у here, и я нахожусь в разделе, где вычисляется сумма чисел, а затем он пытается попытаться выполнить функцию, которая делает среднее число.О Swift: Выполнение было прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_1386_INVOP, subcode = 0x0)

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 
} 

Что я делаю неправильно (что мне нужно, чтобы научиться делать это правильно)?

ответ

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))

0

Для меня эта ошибка произошла из-за того, что неявно развернутое свойство не было установлено. Установка этого вопроса исправит проблему.

Смежные вопросы