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

时间:2018-09-24 04:03:57

标签: 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)

上面的代码应该给出:

  

[“四个”,“五个”,“七个”,“八个”,“九”,“十”,“十一”]

因为它应该将值从0删除到第4,但它会跳过而只删除偶数。

  

[“一个”,“三个”,“五个”,“七个”,“八个”,“九个”,“十个”,“十一个”]

2 个答案:

答案 0 :(得分:2)

因此,您从一个看起来像...的数组开始

userReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            num = dataSnapshot.getChildrenCount();
            textViewCount.setText(String.valueOf((int)num));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"] i时,0将被删除,从而给您留下了一系列的...

"zero"

["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"] i时,1将被删除,从而给您留下了一系列的...

"two"

等等。发生这种情况是因为您不断移动索引。

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

好吧,您可以在每次迭代中删除元素["one", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven"] ,但这很无聊。

您可以做类似...

0

let prefix = testarray[0..<4]
// ["zero", "one", "two", "three"]

let sufix = testarray[5..<testarray.count]
// ["five", "six", "seven", "eight", "nine", "ten", "eleven"]

let remaining = testarray[5...]
// ["five", "six", "seven", "eight", "nine", "ten", "eleven"]

testarray.removeSubrange(0..<4)
// ["four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]

testarray.removeFirst(4)
// ["four", "five", "six", "seven", "eight", "nine", "ten", "eleven"]

这可能是更安全的方法之一,因为它可以让您“删除”更多的元素,然后存在而不会失败

...取决于您的需要和偏好

答案 1 :(得分:1)

每次执行删除操作时,数组元素的索引都会更改。最初,您的数组包含零,一,二,三,...。

删除第0个元素(“零”)后,它包含1、2、3,...。

这时,删除元素1将删除“两个”。根据您编写的代码,完全可以预期您的输出。