所以我在使用Switch语句时遇到问题,当我使用它时,我会在控制台中得到这个“致命错误:范围结束索引没有有效的继承者”. var ArrayBytes : [UInt8] = [48 ,48 ,48] var SuperArrayMensaje : Array = [[UIn
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] }这个问题可以通过这个 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’
我们无法创建包含该整数类型的最大值的范围.问题是,没有大于255的UInt8值.这是必需的,因为要包含在某个范围内的某些内容,它必须小于该范围的结束值.也就是说,与<相比,它必须返回true.操作符.并且没有可以使该语句的UInt8值:255< n返回true.因此,255永远不会处于UInt8类型的范围内. 所以,我们必须找到一种不同的方法. 作为程序员,我们可以知道我们试图创建的范围代表适合UInt8的所有三位十进制数,我们可以在这里使用默认情况:
let u = 255 as UInt8 switch u { case 0...9: print("one") case 10...99: print("two") default: print("three") }
这似乎是最简单的解决方案.我最喜欢这个选项,因为我们不会得到一个我们知道永远不会执行的默认情况.
如果我们真的想要一个案例来捕获从100到UInt8 max的所有值,我们也可以这样做:
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.