作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我创建了一个名为 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/
我是一名优秀的程序员,十分优秀!