gpt4 book ai didi

ios - 在 Swift 中的 For 循环中更改对象的属性

转载 作者:IT王子 更新时间:2023-10-29 05:49:20 26 4
gpt4 key购买 nike

我创建了一个名为 ShoppingList 的简单结构。

struct ShoppingList {

var shoppingListId :NSNumber
var title :String
var groceryItems :[GroceryItem]

init() {
self.title = ""
self.groceryItems = [GroceryItem]()
self.shoppingListId = NSNumber(integer: 0)
}

}

接下来我创建了一个 ShoppingList 数组,如下所示:

 var shoppingLists = [ShoppingList]()

之后,我获取购物 list 等。现在,我遍历 shoppingLists 并更改标题,但它会更新 title 属性。

 for var shoppingList in shoppingLists {
let items = getGroceryItemsByShoppingList(shoppingList)
shoppingList.groceryItems = getGroceryItemsByShoppingList(shoppingList)
shoppingList.title = "BLAH" // copied by value
print("ShoppingList \(shoppingList.title) has \(shoppingList.groceryItems.count) items") // THIS PRINT BLAH
}

print("shoppingLists[0].groceryItems.count \(shoppingLists[0].groceryItems.count)") // THIS PRINTS THE ORIGINAL CONTENT

我相信当我运行循环时它是按值复制的,因此原始数组永远不会改变。如何使用 For 循环更改原始数组?

最佳答案

我会在这里使用两种方法。第一种方法是重新考虑 ShoppingList 是值类型还是引用类型。它有一个标识符这一事实向我表明它确实是一个引用类型。如果两个购物 list 的内容相同,是否应视为同一份 list ?我怀疑不是。有两个具有相同标识符但内容不同的列表意味着什么?如果那是非法的,那往往会指向它是一个引用类型,因为它有一个标识。

如果是引用类型,将其设为final class:

final class ShoppingList {}

Final 类保留了结构的简单性,因为它们没有继承问题。但它们提供引用语义。通过该更改,您的原始代码将起作用。

另一种方法更实用,其中一切都是值(value)。在这种情况下,您可以通过映射购物 list 的副本来实现:

shoppingLists = shoppingLists.map { list in
var newList = list
newList.groceryItems = getGroceryItemsByShoppingList(list)
return newList
}

这促使我们采用更实用的方法,但它使标识符变得笨拙。所以如果你真的想这样做,我想摆脱标识符,甚至可能使购物 list 不可变。在这种情况下,任何两个相同的购物 list 都是相同的 list ,您可以使用更实用的风格来编写。

但我怀疑将 ShoppingList 设为引用类型是更好的方法。

关于ios - 在 Swift 中的 For 循环中更改对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com