Swift类中属性数组的范围元素移除最优方案咨询
如何正确移除Swift数组中指定范围的元素?
首先得纠正你两个小误区:
- 你用
let newVar = objArray[1...3]拿到的其实是被移除的那部分元素,而不是移除后的剩余数组(比如原数组是[0,1,2,3,4],这个操作得到的是[1,2,3],而不是你想要的[0,4])。 - 循环从前往后移除元素会越界,是因为每次移除后数组长度变短,后续元素的索引会前移,但你的循环还是按原索引范围执行,当数组长度不够时就会触发越界错误。
最优解决方案:使用removeSubrange(_:)方法
这是Swift数组专门为移除范围元素设计的方法,一步到位,既安全又高效,还直接修改原数组(前提是数组用var修饰,你原来的let是不可变数组,没法修改,得先改成var)。
示例代码:
class Custom { // 把let改成var,才能修改数组 var objArray: [CustomClass] = [] } // 移除1到3(包含两端)的元素 customInstance.objArray.removeSubrange(1...3)
这个方法会直接在原数组上删除指定范围的元素,内部做了优化,只需要一次O(n)的时间复杂度,比循环移除的多次O(n)高效得多,而且完全不会出现越界问题。
如果你不想修改原数组,只想得到新数组
可以用dropSubrange(_:)方法,它会返回一个排除指定范围的数组切片,转成数组即可:
let newArray = Array(customInstance.objArray.dropSubrange(1...3))
为什么不推荐循环移除?
就算你改成从后往前循环(比如for i in (1...3).reversed() { objArray.remove(at: i) })能避免越界,但这种写法不仅繁琐,而且每次remove(at:)都会移动数组元素,多次操作的总效率远不如removeSubrange,代码可读性也差很多。
内容的提问来源于stack exchange,提问作者Ekra
相关产品推荐
相关产品推荐

