我有一个数组作为类中的属性。
Class Custom {
let objArray: [CustomClass]
}
我想删除范围内的objArray中的一些项目。所以我在下面做了
let newVar = objArray[1…3]
新对象被正确删除但返回值在newVar中,因为数组是值类型,我可以使原始反映相同。
下面的代码随着索引的增加而变得超出范围
for i in 1…3 {
objArray.remove(at: 1)
}
==
上述问题的最佳方法是什么。
任何正确方向的提示都将受到高度赞赏。
答案 0 :(得分:8)
使用removeSubrange
数组方法。按要素range
和location
制作有效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)