2016-01-19 3 views
1

Пользователь Entity Модель-Массив сущности не мутирует в быстром?

class UserEntity: NSObject { 

    var isAlreadyUser:Bool 

    init(isAlerdy:Bool){ 
     isAlreadyUser = isAlerdy 
    } 

} 

App Делегат/Глобальный массив

let new = ["F","E","D","C","B","A"] 
     for obj in new{ 
      arrUser.append(UserEntity(isAlerdy: false)) 
     } 

VIEW CONTROLLER

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

    let home = Array(appDelegate.arrUser) 

    home[0].isAlreadyUser = true 

    print(appDelegate.arrUser[0].isAlreadyUser) 

После того как я редактировать локальный домашний массив и обновление isAlreadyUser истина от ложного. Это также изменяется в глобальном массиве. Даже я мутирую любую копию копии глобального массива, она все равно меняет ее как на массив.

Я думаю, что что-то не так с сущностью. Он силен и не меняется в соответствии с локальным масштабом массива.

Помогите мне.

EDIT:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     var areAlreadyUsers:[UserEntity] = [] 

     areAlreadyUsers = Array(appDelegate.arrUser) 

     areAlreadyUsers[0].isAlreadyUser = true 

     print(appDelegate.arrUser[0].isAlreadyUser) 

Еще не поможет. Мой глобальный массив все еще меняется.

+0

Что именно вы пытаетесь сделать, изменив это значение? –

+0

@tmac_balla Я понимаю, как сделать копию объекта UserEntity? –

ответ

0

Дело в том, что arrUser и home просто содержат указатели на те же самые UserEntity объекты, которые являются уникальными (не копируются). Итак, что вы делаете, вы просто изменяете значение свойства UserEntity, и оно, очевидно, будет отражено везде.

Что вы хотите сделать, это переосмыслить архитектуру вашего приложения, почему бы вам полностью изменить это значение? Например, вы можете создать массив

var areAlreadyUsers:[UserEntity] = [] 

и просто сохранить там указатели для пользователей, которые вы дали бы true значения. Таким образом, эта информация не сохраняется нигде.

+0

Я попытался добавить это, но моя проблема в том, что я «home [0] .isAlreadyUser = true» делает это. Мой глобальный массив также изменяется.Как я могу присвоить этому объекту другую ячейку памяти, чтобы мой глобальный массив не менялся. Надеюсь, я объяснил это. –

+0

@TusharLimaye Это невозможно, потому что эти объекты уникальны. Вы можете создать только тот же объект, но вам не нужно это делать, потому что это нарушает принципы ООП. Вариант, который я вам дал, является единственной хорошей практикой. –

+0

@TusharLimaye Итак, если вы хотите узнать, является ли пользователь isAlreadyUser, вы просто проверяете этот массив и удаляете свойство isAlreadyUser. –

1

Если вы хотите сделать UserEntity в структуру, у вас не возникнет проблема. Нужно ли быть NSObject, если не пытаться использовать struct вместо класса. Таким образом, вы получаете копию на поведение записи.

+0

Большое спасибо. Это решило мою проблему. Но зачем было копировать его, а не NSObject ?? –

+0

@TusharLimaye - это то, что Struct имеет копию на семантике записи, а класс имеет ссылочную семантику. Это фундаментальные аспекты этих языковых элементов. – sylvanaar

1

Проблема:

Элементы массива ReferenceType поэтому только указатели на объекты будут скопированы. Следовательно, их изменение будет отражать в обоих местах.

Решение:

  1. Копировать каждый элемент содержится в массиве.

    вы можете сделать что-то вроде, let localArray = globalArray.map { $0.copy() }. Обратите внимание, что важно, чтобы ваш объект применял любые методы копирования, такие как copyWithZone.

  2. Используйте тип значения, например struct, а не class.
+0

второй вариант работает. но первый - нет. Нет методов, которые копируются в $ 0. Почему мы используем для этого copywithzone? –

+0

$ 0 - это ничего, кроме объектов внутри массива. Таким образом, вы фактически вызываете объект UserEntity. Поскольку он унаследован от NSObject, вы можете использовать любой из методов протокола NSCopying, чтобы облегчить «глубокое копирование». – Vignesh

+0

ohk Спасибо, но я не получаю никаких опций NSObjects для $ 0. Я просто могу получить доступ к свойствам в UserEntity. –