迭代时将元素添加到数组中

时间:2016-07-26 20:56:53

标签: arrays swift loops

我有一个for循环遍历数组中的每个元素。在某种情况下,我在循环内向该数组添加另一个元素。但是,循环不会考虑新元素。如果数组中最初有6个项目并且在循环时,我再添加2个,它仍然只循环6次。我该如何解决这个问题?

for ingredient in ingredientList {
    if ingredient.name == "banana" {
        var orange = Ingredient(name: "orange")
        ingredientList.append(orange)
    }
    if ingredient.name == "orange" {
        // this never executes
    }
}

如果我的一种成分是香蕉,请在列表中添加橙色。但是,循环甚至从不考虑新添加的元素。我怎样才能完成这样的事情以及它为什么不起作用?

4 个答案:

答案 0 :(得分:3)

试试这个:

var array = ["a", "b"]

for i in array.startIndex...array.endIndex {
    if array[i] == "b" {
        array.append("c")
        print("add c")
    }
    if array[i] == "c"{
        array.append("d")
        print("add d")
    }
}

答案 1 :(得分:1)

@ghostatron集合的indices属性可以保存对集合本身的强引用,导致集合被非唯一引用。如果在迭代其索引时改变集合,强引用可能会导致集合的意外副本。要避免意外复制,请使用以startIndex开头的index(after :)方法来生成索引。

var c = MyFancyCollection([10, 20, 30, 40, 50])
var i = c.startIndex
while i != c.endIndex {
    c[i] /= 5
    i = c.index(after: i)
}
 // c == MyFancyCollection([2, 4, 6, 8, 10])

答案 2 :(得分:0)

我认为这里有两个问题:

  1. 一般来说,在枚举时不应修改集合。充其量,它会忽略你。在大多数语言中它都会崩溃。

  2. 我怀疑你在这里看到的是,你的循环正在使用该集合的副本,但你的"追加"正在修改原件。我的理由是,在Swift中,结构通常是副本而不是引用,并且非常奇怪......数组和字典是结构。

答案 3 :(得分:0)

您需要为每个循环使用for循环而不是a,并在添加元素时相应地调整计数器

Int cntVar = 0

for x as Integer = 0 to ingredientList.count - 1 {
    if ingredientList(x + cntVar).name == "banana" {
        var orange = Ingredient(name: "orange")
        ingredientList.append(orange)
        x = x - 1
        cntVar = cntVar + 1
    }
    if ingredientList(x + cntVar).name == "orange" {
        //add needed function here
    }
}