2016-10-27 4 views
1

Я немного борюсь с тем, как XCode 8 и Swift 3 управляют классами в Core Data.Создайте массив объектов, используя класс, сгенерированный Core Data в XCode 8

У меня есть сущность, которую я создал, называется PersonMO («MO» для «Объекта модели»). Я понимаю, что создание моего проекта после создания этого объекта приводит к созданию определения класса в другом месте.

Если я попытаюсь создать массив объектов, используя это определение класса, я получаю сообщение об ошибке.

var people:[PersonMO] = [ 
    PersonMO(age:"24", firstName: "Cassie", isVisited: false, lastName: "Brist", locationCity: "San Francisco", locationState: "CA", notes: "none", phoneNumber: "000-0000", zone: "9") 
] 

Ошибка «Не удается вызвать инициализатор для типа„PersonMO“со списком аргументов типа" аргументов, перечисленным здесь», который имеет смысл, потому что я никогда не инициализируется people массива со значениями по умолчанию.

До XCode 8 и Swift 3 у меня был файл Person.swift, в котором я инициализировал свои значения, но теперь, когда XCode создает класс в другом месте, если я пытаюсь инициализировать в этом файле, я получаю «Недопустимое обновление», PersonMO '".

Как создать жесткий код объектов в XCode 8 и Swift 3?

ответ

0

Ваша проблема не имеет ничего общего с созданными классами. Для создания NSManagedObject (если у вас есть готовые настройки NSPersistentContainer):

var people:[PersonMO] = [] 
persistentContainer.performBackgroundTask { (moc: NSManagedObjectContext) in  

    //create new MO 
    let newPersonMo = PersonMO(context: moc) 

    // set attributes 
    newPersonMo.name = "Peter" 

    //add it to your array 
    people.append(newPersonMo) 

    //save 
    do { 
     try newPersonMo.managedObjectContext?.save() 
    } catch {      
     print("failed to save with error: \(error)") 
    } 
} 

Независимо от вашей проблемы, вы можете выбрать, если и то, что Xcode создает для субъектов Whithin вашей модели Inspector:

Я рекомендую установить CodeGen на Class Definition.

Примечание:, чтобы сделать эту работу без проблем (я предполагаю об ошибке Apple), то Module поле должно быть пустым («глобальное пространство имен» в светло-серый цвет). enter image description here

+0

Awesome, это именно то, что я искал @shallowThought! Вместо этого я могу сделать предварительную загрузку с использованием CSV-файла, но это очень полезная вещь для будущего (я очень новичок в программировании, поэтому часто теряю то, как все части взаимодействуют). – MachTurtle

0

Начиная с iOS 10, есть NSManagedObject.init(context:) инициализатор, который вы можете использовать, а не init(entity:insertInto:). Это расширение, созданное Apple для упрощения создания объекта. Но вам все равно нужно использовать этот инициализатор вместо своего.


Назначенный инициализатор управляемых объектов - init(entity:insertInto:). Вы не должны инициализировать управляемые объекты, используя разные инициализаторы.

Из документации Apple:

Управляемый объект связан с описанием объекта (экземпляр NSEntityDescription), который предоставляет метаданные об объекте (в том числе имя лица, которое представляет объект и имена его атрибуты и отношения) и контекст управляемого объекта, который отслеживает изменения в графе объектов. Важно, чтобы управляемый объект был правильно настроен для использования с Core Data. Если вы создаете экземпляр управляемого объекта напрямую, вы должны вызвать назначенный инициализатор (init(entity:insertInto:)).

+0

Благодарим за отзыв, @Leo.Вы говорите, что для создания массива объектов, построенных из класса PersonMO, сгенерированного Core Data, мне нужно использовать 'init (entity: insertInto:)'? Где я должен выполнить инициализацию, учитывая, что класс PersonMO недоступен из навигатора проекта? – MachTurtle

+0

Лучше всего использовать 'NSEntityDescription.insertNewObject (forEntityName: in:)'. Мы создали категорию над «NSManagedObject», которая автоматизировала это (имя сущности для нас такое же, как имя класса), но нам все равно нужно предоставить контекст. Мы вызвали метод 'insertNewObjectInto (context:)'. –

+0

Вам все это не нужно, поскольку Swift3/Xcode8 – shallowThought

Смежные вопросы