从数组中查找项目的引用 - swift

Find reference of item from array - swift

下面的代码有更短的版本吗? 此外,当使用“for var”访问时,它不会附加,因为它是“按值传递”。有什么建议吗?

struct Food {
    var fruits = [Fruit]()
    var category = "summer fruits"
}
struct Fruit {
    var name = ""
}

var foods = Food()

let fruit = Fruit()
fruit.name == "banana"

for var food in foods    {
    if food.category == "summer fruits" {
        food.fruits.append(fruit)
    }
}

对数组使用 var 很棘手,因为它们在传递时仍然像值一样起作用(您得到的是副本,而不是引用)。

var foods = [Food()]
var food = foods[0]
food.fruits.append(Fruit(name: "banana"))

如果您想修改 foods 数组中的结构,这将不起作用。只要您执行 var food = foods[0],您就会得到 foods[0] 可变副本 。同样的原则是导致您的示例不起作用的原因。您将获得 for 循环中每个元素的可变副本。

不要想成是修改数组内部的struct,而是想修改数组本身。 Swift 中的数组也是结构体,因此更改数组中的任何元素应视为更改数组本身。

foods[0].fruits.append(Fruit(name: "banana"))

这里没有创建值的副本。您直接修改数组的元素。要在循环中执行此操作,您必须使用索引:

for i in 0..<foods.count {
    foods[i].fruits.append(...)
}

如果您只想修改符合您标准的第一个元素,可以使用一种方法来查找特定索引

if let index = foods.firstIndex(where: { [=13=].category == "summer fruits" }) {
    foods[index].fruits.append(fruit)
}

另一方面,您的代码真正受益于避免 var 而尽可能使用 let

let fruit = Fruit(name: "banana")

比您的代码更短更清晰,还可以帮助您避免错误,例如使用 == 而不是 = 进行赋值。