2016-03-30 9 views
3

私は、この "致命的なエラーを取得する範囲で使用すると、スイッチステートメントを使用して問題があります。致命的なエラー:範囲の終わりのインデックスに有効な後継はありません

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] 
    } 
+0

'Mensaje7BM'の情報はありますか? –

+0

本当に必要ではありません。スイッチを入れるタイプは 'UInt8'です。 – nhgrif

+0

関連:[Swift switchステートメントの[Lesser than or greater than](http://stackoverflow.com/q/31656642/2792531) – nhgrif

答えて

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が範囲に含まれていないことに注意する必要があります。

範囲100...255は、100..<256に相当します。私たちはその範囲を構築しようとした場合、我々は、コンパイルエラーを取得:

Integer literal '256' overflows when stored into 'UInt8'

我々はが、その整数型のため最大値を含む範囲を作成することはできません。問題がある場合、UInt8の値は255より大きくなりません。ある範囲内に何かが含まれるためには、それは範囲のend値よりも小さくなければならないからです。つまり、演算子<と比較して真を返す必要があります。この文を作成できる値はUInt8ではありません。255 < nがtrueを返します。そのため、255は決してUInt8の範囲内になることはありません。

だから、私たちは別のアプローチを見つけなければなりません。

プログラマーとして

、我々はUInt8に収まるすべての3桁の10進数を表す作成しようとしている範囲は、私たちはここにdefaultケースを使用することができることを知ることができます。

let u = 255 as UInt8 

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

これがそうです最も簡単なソリューションです。私はこのオプションが一番好きです。なぜなら、われわれが決して実行しないことがわかっているdefaultのケースで終わるわけではないからです。私たちは本当にが明示的にUInt8最大に100からすべての値をキャプチャする場合をしたい場合

、我々はまた、これを行うことができます:

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

をするためにClosedIntervalの詳細については、Apple documentationまたはSwift docを参照してください。

関連する問題