【问题标题】:Fatal error: Range end index has no valid successor致命错误:范围结束索引没有有效的后继
【发布时间】:2016-07-17 20:23:28
【问题描述】:

所以我在使用 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]
    }

【问题讨论】:

标签: swift switch-statement fatal-error exc-bad-instruction


【解决方案1】:

这个问题可以用这个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..&lt;256。如果我们尝试构造那个范围,我们会得到编译错误:

整数文字 '256' 存储到 'UInt8' 时溢出

我们无法创建一个包含该整数类型最大值的范围。有问题的是,没有大于255UInt8 值。这是必需的,因为要包含在一个范围内,它必须小于该范围的 end 值。也就是说,与&lt; 运算符相比,它必须返回true。并且没有 UInt8 值可以做出这样的声明:255 &lt; 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 案例。

如果我们真的明确地想要一个捕获从100UInt8 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 documentationSwift doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多