Swift中实现类Python的ArraySlice子数组选择,求更简洁方案
Swift中实现类似Python的数组切片(替代嵌套suffix/prefix)
你可以直接利用Swift数组的区间下标来实现更简洁的子数组选择,完全替代嵌套的suffix和prefix写法,同时逻辑更直观。
方法一:直接使用区间下标
Swift的数组支持通过闭区间(...)或半开区间(..<)直接获取子数组切片,再转成Array即可:
let startIndex = 3 let endIndex = 7 // 闭区间:包含startIndex和endIndex(完全匹配你的原需求) let newPoints = Array(points[startIndex...endIndex]) // 如果想模拟Python的左闭右开切片(比如Python的points[3:8]对应取索引3到7),用半开区间: // let newPoints = Array(points[startIndex..<(endIndex + 1)])
这种写法无需手动计算数组长度与索引的差值,直接通过索引区间定位,可读性和简洁性都远优于嵌套调用suffix/prefix。
方法二:扩展数组实现类Python切片语法
如果希望写法更贴近Python的切片风格,可以给Array添加扩展,封装切片逻辑:
extension Array { // 模拟Python的array[start:end](左闭右开) subscript(pythonSlice start: Int, end: Int) -> [Element] { let safeStart = max(start, 0) let safeEnd = min(end, count) guard safeStart <= safeEnd else { return [] } return Array(self[safeStart..<safeEnd]) } // 针对你的需求:包含end索引的切片 subscript(inclusive start: Int, end: Int) -> [Element] { let safeStart = max(start, 0) let safeEnd = min(end, count - 1) guard safeStart <= safeEnd else { return [] } return Array(self[safeStart...safeEnd]) } } // 使用示例 let newPoints1 = points[pythonSlice: 3, end: 8] // 等价于Python的points[3:8] let newPoints2 = points[inclusive: 3, end: 7] // 完全匹配你的原代码逻辑
扩展方法还处理了索引越界的情况,让切片逻辑更健壮。
内容的提问来源于stack exchange,提问作者ccmsd18
相关产品推荐
相关产品推荐

