实体数组不会在swift中变异?

时间:2016-01-19 15:56:17

标签: arrays swift mutable

用户实体模型 -

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)

仍然没有帮助。我的全局阵列仍在变化。

3 个答案:

答案 0 :(得分:1)

如果你要将UserEntity变成一个结构,你就不会有问题。如果不尝试使用struct而不是class,它是否需要是NSObject。这样就可以复制写行为。

答案 1 :(得分:1)

问题:

数组的元素是referenceType,因此只会复制指向对象的指针。因此修改它们将反映在两个地方。

解决方案:

  1. 复制数组中包含的每个项目。

    你可以做一些像let localArray = globalArray.map { $0.copy() }这样的事情。请注意,您的对象应该是重要的 实施任何复制方法,例如copyWithZone

  2. 使用struct等值类型代替class

答案 2 :(得分:0)

关键是arrUserhome只包含指向相同UserEntity个对象的指针,这些对象是唯一的(未复制)。 那么你做的只是改变一个UserEntity属性的值,它显然会在任何地方反映出来。

您要做的是重新考虑您的应用架构,为什么要改变这个值?例如,您可以创建一个数组

var areAlreadyUsers:[UserEntity] = []

并保存指向您将提供true值的用户的指针。这样,这些信息就不会保存在任何地方。