从数组中查找项目的引用 - 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")
比您的代码更短更清晰,还可以帮助您避免错误,例如使用 ==
而不是 =
进行赋值。
下面的代码有更短的版本吗? 此外,当使用“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")
比您的代码更短更清晰,还可以帮助您避免错误,例如使用 ==
而不是 =
进行赋值。