2015-01-31 5 views
0

Это работает:Непонятные ошибки в Swift

func averageOf(numbers: Int...) -> Float { 
    var sum = 0 
    for number in numbers { 
     sum += number 
    } 
    return Float(sum)/Float(numbers.count) 
} 
averageOf() // (not a number) 
averageOf(42, 597, 12) // (217.0) 

Но это не так:

func averageOf(numbers: Int...) -> Float { 
    var sum = 0 
    for number in numbers { 
     sum += number 
    } 
    return Float(sum/numbers.count) 
} 
averageOf() 
averageOf(42, 597, 12) 

Это дает мне эту ошибку на } линии:

Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 

я наткнулся another question с тем же первым и вторым фрагментом кода, и автор, по-видимому, не получает того же err ПРС.

Давайте снимем этот бросок:

func averageOf(numbers: Int...) -> Float { 
    var sum = 0 
    for number in numbers { 
     sum += number 
    } 
    return sum/numbers.count 
} 
averageOf() 
averageOf(42, 597, 12) 

Это дает мне эту ошибку, на знак деления:

Cannot invoke '/' with an argument list of type '(@lvalue Int, Int)' 

Если я после этого изменить тип возвращаемого значения функции Int:

func averageOf(numbers: Int...) -> Int { 
    var sum = 0 
    for number in numbers { 
     sum += number 
    } 
    return sum/numbers.count 
} 
averageOf() 
averageOf(42, 597, 12) 

Я получаю ту же ошибку EXC_BAD_INSTRUCTION.

Если я бросаю только numbers.count:

func averageOf(numbers: Int...) -> Int { 
    var sum = 0 
    for number in numbers { 
     sum += number 
    } 
    return sum/Float(numbers.count) 
} 
averageOf() 
averageOf(42, 597, 12) 

Я получаю эту ошибку на знаке деления:

Cannot invoke 'init' with an argument list of type '(@lvalue Int, $T5)' 

Я также получаю эту ошибку, если я изменить возвращаемый тип обратно Float.

Все это не имеет для меня никакого смысла. Это Xcode, идущий по почте, или я пропустил что-то тонкое?

ответ

3

Как уже объяснялось, проблема во втором примере связана с вызовом averageOf() без аргументов, что приводит к делению на ноль. Однако, первый averageOf() работает, опять же без аргументов, почему? Позвольте мне добавить еще несколько деталей.

В первом случае вы сообщили, вы не получите сообщение об ошибке и averageOf() работы, потому что вы бросаете два Int операндов Float перед делением.
В мире Float numbers, 0.0 всего лишь приблизительное значение 0. Если вы попробуете 0.0/0.0 на игровой площадке, в итоге вы не получите сообщение об ошибке, а результат будет not a number.

Во втором случае, однако, вы пытаетесь разделить 0 на 0 перед литьем до Float. Поэтому при выполнении деления мы все еще находимся в области Int. Результатом является ошибка из-за деления на ноль (здесь не задействовано приближение). Если вы попробуете 0/0 на игровой площадке, вы получите сообщение об ошибке.

Все остальные случаи не объяснена Int против Float поведения на, обусловлены тем, что Swift требует, чтобы вы явно бросили между типами, даже если другой язык позволил бы разыгрывании операнды неявно.

1

Эта ошибка возникает из-за вашего функционального вызова averageOf().
Если вы не передадите значения, то переменному параметру numbers будет создан пустой массив.
Это count свойство поэтому возврат 0. И вы не можете делить на 0. Это также причина, почему она говорит BAD_INSTRUCTION.

Если вы удалите averageOf() со своего второго примера кода, он будет работать.

+0

Это было ... Спасибо. –

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