用户实体模型 -
class UserEntity: NSObject {
var isAlreadyUser:Bool
init(isAlerdy:Bool){
isAlreadyUser = isAlerdy
}
}
App Delegate / Global Array
let new = ["F","E","D","C","B","A"]
for obj in new{
arrUser.append(UserEntity(isAlerdy: false))
}
查看控制器
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let home = Array(appDelegate.arrUser)
home[0].isAlreadyUser = true
print(appDelegate.arrUser[0].isAlreadyUser)
编辑本地home阵列并从false更新isAlreadyUser为true。这也在全局数组中发生变化。即使我正在改变任何制作全局数组的副本,它仍然会改变它我的数组。
我认为实体有些不对劲。它很强大,不会根据数组的局部范围而改变。
帮帮我。
编辑:
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var areAlreadyUsers:[UserEntity] = []
areAlreadyUsers = Array(appDelegate.arrUser)
areAlreadyUsers[0].isAlreadyUser = true
print(appDelegate.arrUser[0].isAlreadyUser)
仍然没有帮助。我的全局阵列仍在变化。
答案 0 :(得分:1)
如果你要将UserEntity
变成一个结构,你就不会有问题。如果不尝试使用struct而不是class,它是否需要是NSObject
。这样就可以复制写行为。
答案 1 :(得分:1)
问题:
数组的元素是referenceType,因此只会复制指向对象的指针。因此修改它们将反映在两个地方。
解决方案:
复制数组中包含的每个项目。
你可以做一些像let localArray = globalArray.map {
$0.copy() }
这样的事情。请注意,您的对象应该是重要的
实施任何复制方法,例如copyWithZone
。
struct
等值类型代替class
。答案 2 :(得分:0)
关键是arrUser
和home
只包含指向相同UserEntity
个对象的指针,这些对象是唯一的(未复制)。
那么你做的只是改变一个UserEntity
属性的值,它显然会在任何地方反映出来。
您要做的是重新考虑您的应用架构,为什么要改变这个值?例如,您可以创建一个数组
var areAlreadyUsers:[UserEntity] = []
并保存指向您将提供true
值的用户的指针。这样,这些信息就不会保存在任何地方。