Swift &引用;数组索引超出范围:“0”;当从数组中获取范围时

Swift &引用;数组索引超出范围:“0”;当从数组中获取范围时,swift,Swift,我有一个数组anArray,我想通过指定一个范围range来创建一个子数组,如: var range: Range<Int> guard let slice = anArray[range] else { return nil } 但我看到数组超出范围异常。你能告诉我我错过了什么吗?你的操作员在倒车,警卫应该确保 guard range.upperBound <= anArray.count - 1 else { ... guard range.upper

我有一个数组
anArray
,我想通过指定一个范围
range
来创建一个子数组,如:

 var range: Range<Int>
 guard let slice = anArray[range] else {
      return nil
 }

但我看到数组超出范围异常。你能告诉我我错过了什么吗?

你的操作员在倒车,警卫应该确保

guard range.upperBound <= anArray.count - 1 else { ...
guard range.upperBound


(如果else块的条件为true,则保护程序将跳过该块-它不是if,而是else)。

除了使用错误的运算符之外,请注意,并非所有集合都从零开始,并且并非所有集合的索引前都有元素。这就是订阅的结果,它返回一个
ArraySlice
。您应该始终检查集合索引,而不是其计数。恢复您应该检查您的范围是否符合集合索引。看看这个。请注意,
RandomAccessCollection
的下标不返回可选值,如果传递无效的范围,它将崩溃

guard range.clamped(to: anArray.indices) == range else {
    return nil
}

let slice = anArray[range]

你能用完整的错误信息更新问题吗?
guard range.clamped(to: anArray.indices) == range else {
    return nil
}

let slice = anArray[range]