[英]Array of entity does not mutate in swift?
用户实体模型
class UserEntity: NSObject {
var isAlreadyUser:Bool
init(isAlerdy:Bool){
isAlreadyUser = isAlerdy
}
}
应用程序委托/全局数组
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数组并将isAlreadyUser从false更新为true之后。 这也在全局数组中发生了变化。 即使我正在变异任何复制全局数组的副本,它仍然会在两个数组中对其进行更改。
我认为实体有些问题。 它很强,并且不会根据数组的局部范围而变化。
帮帮我。
编辑:
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
var areAlreadyUsers:[UserEntity] = []
areAlreadyUsers = Array(appDelegate.arrUser)
areAlreadyUsers[0].isAlreadyUser = true
print(appDelegate.arrUser[0].isAlreadyUser)
仍然没有帮助。 我的全局阵列仍在变化。
如果您要使UserEntity
成为一个结构,就不会有问题。 如果不尝试使用struct而不是class的话,它是否需要为NSObject
? 这样,您就可以复制写入行为。
问题:
数组的元素是referenceType,因此将仅复制指向对象的指针。 因此,修改它们将在两个地方都反映出来。
解:
复制数组中包含的每个项目。
您可以执行以下操作, let localArray = globalArray.map { $0.copy() }
。 请注意,您的对象应实现任何复制方法(例如copyWithZone
,这一点很重要。
struct
之class
的值类型代替class
。 关键是arrUser
和home
仅包含指向相同UserEntity
对象的指针,这些对象是唯一的(未复制)。 因此,您只需要更改UserEntity
属性的值UserEntity
,它显然会在所有地方得到反映。
您想要做的是重新考虑您的应用程序架构,为什么您要彻底改变此值? 例如,您可以创建一个数组
var areAlreadyUsers:[UserEntity] = []
并只保存指向用户的指针,您将获得true
价值。 这样,此信息就不会保存在任何地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.