2016-03-30 41 views
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] 
    } 
+0

你可以給'Mensaje7BM'的信息? –

+0

這不是真的需要。正在打開的類型是「UInt8」。 – nhgrif

+0

相關:[小於或大於Swift switch語句](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) 

這不會編譯。首先,我們必須注意Range構造函數的參數end未包含在範圍內。

範圍100...255相當於100..<256。如果我們試圖構建一個範圍,我們得到的編譯錯誤:

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

我們不能創建一個範圍,其包括爲整數類型的最高值。問題是,沒有UInt8的值大於255。這是必要的,因爲對於包含在某個範圍內的東西,它必須小於該範圍的值。也就是說,與<運營商相比,它必須返回true。並且沒有UInt8值可以使此聲明:255 < n返回true。因此,255永遠不能在UInt8類型的範圍內。

所以,我們必須找到一種不同的方法。

作爲程序員,我們可以知道,我們正在試圖創建代表所有符合在UInt8三位數的十進制數的範圍內,我們可以只使用default情況下在這裏:

let u = 255 as UInt8 

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

這似乎最簡單的解決方案。我最喜歡這個選項,因爲我們不會得到我們知道永遠不會執行的default案例。

如果我們真的明確希望捕獲所有從100的值來UInt8最大的情況下,我們也可以這樣做:

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 documentationSwift doc

相關問題