2015-02-05 4 views
1

Я очень новой для разработки Swift и IOS, но я столкнулся с ошибкой, которая вызывает мое приложение к сбою при запуске на следующих устройствах:IOS Swift - EXC_BAD_INSTRUCTION на некоторых устройствах

iPhone 4S iPhone 5 IPad 2 IPad Retina

Вот код, который в настоящее время попадает вверх:

// bin2dec - converts binary string into decimal string 
func bin2dec(input: String) -> String { 
    var counter = countElements(input) 
    var digit: Character 
    var power = 1 
    var result = 0 

    while counter > 0 { 
     digit = input[advance(input.startIndex, counter-1)] 

     switch digit { 
     case "0": 
      result += 0 
     case "1": 
      result += 1 * power 
     default: 
      power = power/2 
      break 
     } 
     counter-- 
     power *= 2 
    } 
    return "\(result)" 
} 

и ошибка:

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0) 

Любая помощь будет оценена, спасибо!

+0

Какой ввод убивает его, и в какой строке? – cjwirth

+0

О да, конечно, внутри переключателя на линии с футляром «0»: и когда он получает полную 32-битную строку, например. (1111111111111111111111111111111111) – SimonTheEngineer

ответ

7

iPhone 4S, iPhone 5, iPad 2, iPad Retina - это 32-разрядные устройства, где Int - это 32-разрядное целое число. Поэтому, начиная с

var power = 1 

и затем вызвать

power *= 2 

32 раз переполнится и вызвать исключение. В Свифта, целочисленная арифметика не молча «обтекать», как в (C) объективно-, , если явно не использовать «операторы переполнения» &*, &+ и т.д.

Возможные решения:

  • использования Int64 вместо Int.
  • Избегайте окончательного умножения power (результат которого не ).

Обратите внимание, что есть более простые способы, чтобы преобразовать строку двоичных цифр в ряд, смотри, например, How to convert a binary to decimal in Swift?.

+1

Возможно также стоит отметить, что на текущих 64-разрядных устройства проблема все еще возникает, но с строками в два раза больше. – cjwirth

+0

Конечно, глупо меня. Спасибо что подметил это! – SimonTheEngineer

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