Swift删除Array范围内的对象

时间:2018-04-02 12:18:16

标签: ios arrays swift

我有一个数组作为类中的属性。

Class Custom {
 let objArray: [CustomClass]
}

我想删除范围内的objArray中的一些项目。所以我在下面做了

let newVar  = objArray[1…3]

新对象被正确删除但返回值在newVar中,因为数组是值类型,我可以使原始反映相同。

下面的代码随着索引的增加而变得超出范围

for i in 1…3 {

  objArray.remove(at: 1)
}

==

上述问题的最佳方法是什么。

任何正确方向的提示都将受到高度赞赏。

4 个答案:

答案 0 :(得分:8)

使用removeSubrange数组方法。按要素rangelocation制作有效length

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let range = 1...3
array.removeSubrange(range)

print(array)

输出: [1, 5, 6, 7, 8, 9, 10]

注意: 范围应该是有效范围我的意思是它不应该从数组中出来。

这是你的方式(通过for循环) 我们无法通过循环中的索引删除对象,因为每次对象都会删除数组的计数,并且对象索引会发生变化,因此可能会出现超出范围的崩溃,或者您可能会得到错误的输出。所以你必须得到另一个阵列的帮助。见下面的例子: -

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var newArray: [Int] = []
let minRange = 1
let maxRange = 3
for i in 0..<array.count {
     if i >= minRange && i <= maxRange {
        /// Avoid
        continue
     }

     newArray.append(array[i])
}

print(newArray)

输出: [1, 5, 6, 7, 8, 9, 10]

答案 1 :(得分:2)

如果您想在范围内按索引删除项目,您必须将索引反转以从最高索引开始,否则您将获得超出范围的异常。还要考虑索引是从零开始的。

这是一个安全的版本,它也会检查数组的上限。

1. var searchSplit = searchTerm.replace(/ /g, "'):containsi('")


2. $.extend($.expr[':'], {'containsi': function(elem, i, match, array){
return (elem.textContent || elem.innerText || '').toLowerCase()
.indexOf((match[3] || "").toLowerCase()) >= 0;}});

3. $("#list li").not(":containsi('" + searchSplit + "')").each(function(e)

答案 2 :(得分:1)

此解决方案还会返回删除的值

extension Array {
   /**
    * ## Examples:
    * var arr = [0,1,2,3]
    * arr.remove((0..<2)) // 0,1
    * arr // 2,3
    */
   mutating func remove(_ range: Range<Int>) -> Array {
      let values = Array(self[range])
      self.removeSubrange(range)
      return values
   }
}

答案 3 :(得分:0)

您遇到的问题是数组索引是基于零的,也就是说,数组中的第一个元素是通过以下方式访问的:

Let firstArrayValue = objArray[0]

所以对于你的for循环,你需要从i接一个1来获得正确的索引值:

for i in 1 ... 3 {

objArray.remove(at:i-1) }

更好的方法是从0开始循环索引.i = 0将引用objArray中的第一个值:

for i in 0...2 {
    objArray.remove(at: i)
}

如果需要删除数组中间的元素,必须先找到它们的索引位置然后删除。要找到索引:

let indexLocation = objArray(indexOf: "Value in Array")

然后删除:

objArray.remove(at: indexLocation)