iOS Swift - 某些设备上的EXC_BAD_INSTRUCTION

Sim*_*eer 1 crash ios exc-bad-instruction swift

我是Swift和iOS开发的新手,但我遇到了一个错误,导致我的应用程序在以下设备上运行时崩溃:

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)"
}
Run Code Online (Sandbox Code Playgroud)

而错误是:

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0)
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,谢谢!

Mar*_*n R 7

iPhone 4S,iPhone 5,iPad 2,iPad Retina是32位设备,其中Int 是32位整数.因此从一开始

var power = 1
Run Code Online (Sandbox Code Playgroud)

然后打电话

power *= 2
Run Code Online (Sandbox Code Playgroud)

32次会溢出并导致异常.在斯威夫特,整数运算并不默默"环绕"在(Objective-)C,除非你明确地使用"溢出运营商" &*,&+等等.

可能的解决方案:

  • Int64而不是Int.
  • 避免最终的乘法power(不需要其结果).

请注意,有一些更简单的方法可以将二进制数字字符串转换为数字,例如,请参阅如何在Swift中将二进制数转换为十进制数?.