gpt4 book ai didi

swift - fatal error : Range end index has no valid successor

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:28 25 4
gpt4 key购买 nike

所以我在使用 Switch 语句时遇到问题,当我将它与范围一起使用时,我在控制台中收到此“ fatal error :范围结束索引没有有效的后继者”。

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)

这不会编译。首先,我们必须注意 end Range 的参数构造函数不包含在范围内。

范围 100...255相当于100..<256 .如果我们尝试构造该范围,则会出现编译错误:

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

我们无法创建一个包括该整数类型的最大值的范围。有问题的是,没有 UInt8值大于 255 .这是必需的,因为要将某些内容包含在一个范围内,它必须小于 end。范围的值。也就是说,与 < 相比,它必须返回 true运算符(operator)。而且没有 UInt8可以进行此声明的值:255 < n返回真。因此,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 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 .

关于swift - fatal error : Range end index has no valid successor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com