добавление объектов в массив создает двойные значения в swift - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив пользовательских объектов, но когда я добавляю элементы в массив, создается дубликат последнего элемента, добавленного в массив.Ниже мой код, пожалуйста, предложите, где ошибка, эта маленькая вещь не может ее найти.

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, содержит различные значения.

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

Прежде всего, никогда не печатайте бессмысленную буквенную строку, такую ​​как "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)
}

И, пожалуйста, обратите внимание и исправьте предупреждения о никогда не изменяемых переменных

...