gpt4 book ai didi

swift - 负 ArraySlice : index is out of range

转载 作者:搜寻专家 更新时间:2023-11-01 06:06:21 25 4
gpt4 key购买 nike

我不明白为什么我会在循环的第二次迭代中遇到错误。你能帮我了解问题出在哪里吗?

let NumTracks = 3
let TrackBytes = 2

func readBytes(input: [UInt8]?) {
if let input = input {
var input = input[0..<input.count]
for _ in 0..<NumTracks {
print(input[0..<TrackBytes]) // fatal error: Negative ArraySlice index is out of range
input = input[TrackBytes..<input.count]
}
}
}
let samples = [UInt8]?([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
readBytes(samples)

another test case like this one也没有理由崩溃。

编辑

当我使用这个代码变体时我没有收到错误(我仍然不知道为什么):

let NumTracks = 3
let TrackBytes = 2

func readBytes(input: [UInt8]?) {
if let input = input {
var input = input[0..<input.count]
for _ in 0..<NumTracks {
print(input[input.startIndex..<input.startIndex.advancedBy(2)])
input = input[input.startIndex.advancedBy(2)..<input.endIndex]
}
}
}
let samples = [UInt8]?([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
readBytes(samples)

最佳答案

原因是取一个数组切片保留了原来的数组索引:

let array = [1, 2, 3, 4]
let slice = array[1 ..< 3]

print(slice) // [2, 3]
print(slice.startIndex) // 1
print(slice.endIndex) // 3

print(slice[1]) // 2 (the first element of the slice)
print(slice[0]) // fatal error: Index out of bounds

在你的例子中,在第一次调用之后

input = input[TrackBytes..<input.count]

input 的第一个有效索引是 TrackBytes 而不是 0 并且因此下一次调用

input[0..<TrackBytes]

导致运行时错误。

所以一个集合的startIndex不一定为零,你已经找到了解决办法,另一个是

func readBytes(input: [UInt8]?) {
if let input = input {
var input = input[0..<input.count]
for _ in 0..<NumTracks {
print([UInt8](input.prefix(TrackBytes)))
input = input.suffixFrom(input.startIndex + TrackBytes)
}
}
}

甚至更短,无需重复修改本地数组切片:

func readBytes(input: [UInt8]?) {
if let input = input {
for start in 0.stride(to: NumTracks * TrackBytes, by: TrackBytes) {
print([UInt8](input[start ..< start + TrackBytes]))
}
}
}

关于swift - 负 ArraySlice : index is out of range,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36251822/

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