Swift集合切片的边界检查机制及空数组索引崩溃问题
Swift集合切片的边界检查机制解析
直接索引访问和切片操作的行为差异,本质是两者的设计定位不同:
直接索引的严格检查
当你通过array[index]直接访问元素时,Swift的设计目标是获取一个确定存在的元素。因此它会严格校验索引的有效性:索引必须落在集合的startIndex(包含)到endIndex(不包含)范围内。
对于空数组let array: [Int] = [],它的startIndex和endIndex都是0,不存在满足startIndex ≤ index < endIndex的索引。所以执行array[0]时,会直接触发Index out of range运行时崩溃。
切片操作的自动裁剪
切片操作(比如array[0...])的目标是获取原集合的一个子范围视图,而非特定元素。Swift会自动将你指定的范围裁剪到原集合的有效区间内:
- 如果切片的起始索引大于等于集合的
endIndex,结果就是空切片; - 如果切片的结束索引小于集合的
startIndex,结果也是空切片; - 若范围部分重叠,就取重叠的部分作为切片结果。
还是以空数组为例,array[0...]指定的起始索引0等于空数组的endIndex,所以被裁剪为空切片,不会触发崩溃。再比如对非空数组let arr = [1,2,3]执行arr[5...],同样会得到空切片,执行arr[...10]则会返回整个数组[1,2,3]。
内容的提问来源于stack exchange,提问作者Daniel Quintillán Quintillán
相关产品推荐
相关产品推荐

