Fatal error: Range end index has no valid successor
Fatal error: Range end index has no valid successor
所以我在使用 Switch 语句时遇到问题,当我将它与范围一起使用时,我在控制台中得到了这个 "Fatal error: Range end index has no valid successor"。
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'
我们无法创建包含该整数类型的最大值的范围。问题是,没有 UInt8
值大于 255
。这是必需的,因为要将某些内容包含在范围内,它必须小于范围的 end
值。也就是说,与 <
运算符相比,它必须 return 为真。并且没有 UInt8
值可以使此语句成立:255 < n
return 为真。因此,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 documentation or Swift doc。
所以我在使用 Switch 语句时遇到问题,当我将它与范围一起使用时,我在控制台中得到了这个 "Fatal error: Range end index has no valid successor"。
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'
我们无法创建包含该整数类型的最大值的范围。问题是,没有 UInt8
值大于 255
。这是必需的,因为要将某些内容包含在范围内,它必须小于范围的 end
值。也就是说,与 <
运算符相比,它必须 return 为真。并且没有 UInt8
值可以使此语句成立:255 < n
return 为真。因此,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 documentation or Swift doc。