Arrays array.remove似乎由于未知原因跳过了元素

Arrays array.remove似乎由于未知原因跳过了元素,arrays,swift,Arrays,Swift,不知何故,array.remove看起来做了一些奇怪的事情。代码如下: var test = "zero one two three four five six seven eight nine ten eleven" var testarray = test.components(separatedBy: " ") for i in 0..<4{ testarray.remove(at: i) } print(testarray) var测试=“0123456789 1011

不知何故,
array.remove
看起来做了一些奇怪的事情。代码如下:

var test = "zero one two three four five six seven eight nine ten eleven"
var testarray = test.components(separatedBy: " ")
for i in 0..<4{
    testarray.remove(at: i)
}
print(testarray)
<代码> var测试=“0123456789 1011” var testarray=test.components(以:“”分隔)
对于0..中的i,每次执行删除操作时,数组元素的索引都会发生变化。最初,数组包含零、一、二、三、

删除第0个元素(“零”)后,它包含一、二、三、


此时,移除元件1将移除“2”。您的输出完全基于您编写的代码。

因此,您可以从一个数组开始,看起来像

["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
let prefix = testarray[0..<4]
// ["zero", "one", "two", "three"]
i
0
时,
将删除“零”
,留下一个数组

["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
["one", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
i
1
时,
“两个”
将被删除,留下一个数组

["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
["one", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
诸如此类。这是因为您一直在移动索引

那么,如何删除前4个元素呢

嗯,您可以在每次迭代中删除元素
0
,但这很无聊

你可以做一些像

["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]
let prefix = testarray[0..<4]
// ["zero", "one", "two", "three"]

哪种方法可能是更安全的方法之一,因为它允许您“删除”更多元素,然后无故障地存在


。。。根据您的需要和偏好

在循环的开始和结束处打印
testarray
i
的值。很明显,这就是我得到的0,1,1,3,2,5,3,7,0(数组中的第一个)是1,但是0。应该是零好的,因此
i
0
,您删除
4
i
1
,这使得
7
成为下一个元素-跳过
5
,因为它现在位于
0
:/。相反,循环直到数组长度为
0
。问题是在删除元素时需要反转索引<代码>对于步幅中的i(从:3,到:0,by:-1){。顺便说一句,对于步幅中的i(从:3,到:0,by:-1){更容易使用
removeFirst(4)
@javaperson尝试
(从:3,到:0,by:-1){
但是正如我说的,使用
testarray.removeFirst(4)
为什么不简单地
testarray[5…]
请注意,如果不检查阵列,可能会导致应用程序崩溃count@LeoDabus我将把它添加到列表中最重要的是告诉OP始终以相反的方式删除它们order@LeoDabus我不知道,您可以使用相同的循环,但始终删除元素
0
:/@LeoDabus所有示例“工作”在某种程度上,基于用户提供的可用信息,我个人可能会使用它,但由于“原因”是断章取义的,我会让OP来决定哪一个最能满足他们的需求
testarray.dropFirst(4)
// ["four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]