ios - 在数组中添加对象会在 swift 中创建重复值
问题描述
我有一个自定义对象数组,但是当我将项目添加到数组时,它会创建最后一项添加到数组中的副本。下面是我的代码,请指点错误在哪里,这个小东西搞不定。
var tempArr:[AnimalViewModel] = [AnimalViewModel]()
do {
var objAnimal = Animal()
var result = try managedContext.fetch(fetchRequest)
for ds in result as! [NSManagedObject] {
objAnimal.name = (ds.value(forKey: "name")) as! String
objAnimal.type = (ds.value(forKey: “type”)) as! String
Var objAVM = AnimalViewModel(aniModel: objAnimal)
tempArr.append(objAVM)
}
} catch {
print(" Error ")
}
数组 tempArr 包含所有重复元素作为最后插入的元素,即使 objAnimal 包含不同的值。
谢谢,
解决方案
首先,永远不要像"Error"
在 catch 块中那样打印无意义的文字字符串。始终打印error
实例。
Animal
显然是一个类(引用类型)。您正在创建一个实例,并且属性会在循环中更新。与往常一样,使用相同的实例,值将被覆盖,您将获得result.count
具有相同内容的项目。
在循环内创建新实例并替换Entity
为真实实体名称
var tempArr = [AnimalViewModel]()
do {
let result = try managedContext.fetch(fetchRequest) as! [Entity] // let !
for ds in result {
let objAnimal = Animal() // let !
objAnimal.name = ds.name
objAnimal.type = ds.type
let objAVM = AnimalViewModel(aniModel: objAnimal) // let !
tempArr.append(objAVM)
}
} catch {
print(error)
}
并且请注意并修复关于从未变异变量的警告
推荐阅读
- python - 如何在画布上从上到下绘制段落?
- javascript - BIRT - Javascript Math.abs 函数不起作用
- .net - 为什么我的连接字符串失败?
- spring-integration - Spring Integration 将有效负载转换为服务激活器中的对象
- python-3.x - Python - 尝试向 Codeforces 发送请求
- java - ArrayList 类在离开 whileloop 后丢失变量
- asp.net - 如何在我的 ASP.Net Core 2.0 项目中实现 Active Directory?
- file - SharePoint Online 选择性脱机同步
- ionic-framework - 如何试用新的 Ionic 4 (beta) 而对现有的 Ionic 3 应用程序 (Win 10) 没有副作用?
- c# - 如何使用 C# 将工作表的主题应用于一系列 Excel 单元格