3

そのため、Switch ステートメントの使用に問題があります。範囲で使用すると、コンソールに「致命的なエラー: 範囲の終了インデックスに有効な後継者がありません」というメッセージが表示されます。

var ArrayBytes : [UInt8] = [48 ,48 ,48]
 var SuperArrayMensaje : Array = [[UInt8]]()
var num7BM : Array = [UInt8]()

    for var Cont27 = 0; Cont27 < 800; Cont27++ {

        ArrayBytesReservaSrt = String(Mensaje7BM[Cont27])

        switch Mensaje7BM[Cont27] {

        case 0...9 :
                     num7BM = Array(ArrayBytesReservaSrt.utf8)
                     ArrayBytes.insert(num7BM[0], atIndex: 2)

        case 10...99 :
                     num7BM = Array(ArrayBytesReservaSrt.utf8)
                     ArrayBytes.insert(num7BM[0], atIndex: 1)
                     ArrayBytes.insert(num7BM[1], atIndex: 2)

        case 100...255 : // --> THE problem is here "EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)"
                     num7BM = Array(ArrayBytesReservaSrt.utf8) 
                     ArrayBytes.insert(num7BM[0], atIndex: 0)
                     ArrayBytes.insert(num7BM[1], atIndex: 1)
                     ArrayBytes.insert(num7BM[2], atIndex: 2)


        default : break

        }

    SuperArrayMensaje.insert(ArrayBytes, atIndex: Cont27)

                ArrayBytes = [48 ,48 ,48]
    }
4

1 に答える 1

7

この問題は、次のMCVEで再現できます。

let u = 255 as UInt8

switch u {
case 0...9: print("one")
case 10...99: print("two")
case 100...255: print("three")
}

そして、この範囲をカバーする範囲変数を単純に作成しようとすると、ある程度問題が発生します。

let r = Range<UInt8>(start: 100, end: 256)

これはコンパイルされません。まず、コンストラクタのend引数が範囲に含まれていないことに注意する必要があります。Range

範囲100...255は に相当し100..<256ます。その範囲を構築しようとすると、コンパイル エラーが発生します。

「UInt8」に格納すると整数リテラル「256」がオーバーフローする

その整数型の最大値を含む範囲を作成することはできません。問題は、UInt8より大きい値がないことです255end何かが範囲内に含まれるには、範囲の値よりも小さい必要があるため、これが必要です。つまり、<演算子と比較したときに true を返す必要があります。そしてUInt8、このステートメントを作成できる値はありません: 255 < ntrue を返します。したがって、255type の範囲には決してなりませんUInt8

したがって、別のアプローチを見つける必要があります。

プログラマーとして、作成しようとしている範囲が、 に収まる 3 桁の 10 進数すべてを表していることを知ることがUInt8できdefaultます。

let u = 255 as UInt8

switch u {
case 0...9: print("one")
case 10...99: print("two")
default: print("three")
}

これが最も簡単な解決策のようです。私はこのオプションが一番気に入っています。なぜなら、default決して実行されないことが分かっているケースに行き着かないからです。

からmaxまでのすべての値をキャプチャするケースが本当に明示的に必要な場合は、次のようにすることもできます。100UInt8

switch u {
case 0...9: print("one")
case 10...99: print("two")
case 100..<255, 255: print("three")
default: print("how did we end up here?")
}

またはこのように:

switch u {
case 0...9: print("one")
case 10...99: print("two")
case 100...255 as ClosedInterval: print("three")
default: print("default")
}

の詳細については、 Apple のドキュメントまたはSwift のドキュメントClosedIntervalを参照してください。

于 2016-03-30T02:42:30.263 に答える