【问题标题】:Find reference of item from array - swift从数组中查找项目的引用 - swift
【发布时间】:2020-11-04 23:10:33
【问题描述】:

下面的代码有更短的版本吗? 此外,当使用“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)
    }
}

【问题讨论】:

  • 好的,我已经编辑了
  • 你不能迭代foods它需要符合Sequence。
  • 这不是minimal reproducible example。正如弗兰肯斯坦所说,for var food in foods 会产生编译器错误。 var category = String 也不会编译。
  • 对不起,我拼错了你能再看看吗?
  • 你还没有解决真正的问题。您是否尝试过运行此代码?

标签: arrays swift search collections iterable


【解决方案1】:

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

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

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

不要将其视为修改数组内部的结构,而应考虑修改数组本身。 Swift 中的数组也是结构体,因此更改数组中的任何元素都应视为更改数组本身。

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

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

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

如果您只想修改与您的条件匹配的第一个元素,有一种方法可以找到特定索引

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

另一方面,避免使用var 而是尽可能多地使用let 确实会使您的代码受益。

let fruit = Fruit(name: "banana")

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多