我有一个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
}
}
如果我的一种成分是香蕉,请在列表中添加橙色。但是,循环甚至从不考虑新添加的元素。我怎样才能完成这样的事情以及它为什么不起作用?
答案 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)
我认为这里有两个问题:
一般来说,在枚举时不应修改集合。充其量,它会忽略你。在大多数语言中它都会崩溃。
我怀疑你在这里看到的是,你的循环正在使用该集合的副本,但你的"追加"正在修改原件。我的理由是,在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
}
}