Seb*_*tro 3 switch-statement fatal-error exc-bad-instruction swift
所以我在使用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]
}
Run Code Online (Sandbox Code Playgroud)
使用此MCVE可以重现此问题:
let u = 255 as UInt8
switch u {
case 0...9: print("one")
case 10...99: print("two")
case 100...255: print("three")
}
Run Code Online (Sandbox Code Playgroud)
在某种程度上,如果我们只是尝试创建一个覆盖此范围的范围变量,我们就会发现问题:
let r = Range<UInt8>(start: 100, end: 256)
Run Code Online (Sandbox Code Playgroud)
这不编译.首先,我们必须注意,构造函数的end参数Range不包含在范围内.
范围100...255相当于100..<256.如果我们尝试构造该范围,我们会得到编译错误:
存储到'UInt8'时,整数文字'256'溢出
我们无法创建包含该整数类型的最大值的范围.问题是,没有UInt8大于的价值255.这是必要的,因为要在某个范围内包含某些内容,它必须小于end该范围的值.也就是说,与<运营商相比,它必须返回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")
}
Run Code Online (Sandbox Code Playgroud)
这似乎是最简单的解决方案.我最喜欢这个选项,因为我们最终得不到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?")
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
switch u {
case 0...9: print("one")
case 10...99: print("two")
case 100...255 as ClosedInterval: print("three")
default: print("default")
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息ClosedInterval,请参阅Apple文档或Swift文档.