1

私は 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)"
}

エラーは次のとおりです。

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

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

7

iPhone 4S、iPhone 5、iPad 2、iPad Retina は 32 ビット デバイスで、Int は 32 ビット整数です。したがって、

var power = 1

そして呼び出す

power *= 2

32 回オーバーフローし、例外が発生します。&*Swift では、「オーバーフロー演算子」などを明示的に使用しない限り、整数演算は (Objective-)C のように静かに「ラップアラウンド」しません&+

可能な解決策:

  • Int64の代わりに使用しIntます。
  • power(その結果は必要ありません)の最終的な乗算を避けます。

2 進数の文字列を数値に変換する簡単な方法があることに注意してください。たとえば、Swift でバイナリを 10 進数に変換する方法を参照してください。.

于 2015-02-05T13:21:00.233 に答える