Создание Swift-моделей из основных объектов данных

обновление для Xcode 8:

в Xcode 8 нужно перейти в Редактор модели основных данных и показать инспектор файлов. В нижней части находится опция для генерации кода. Выберите Swift.

редактировать: Я нашел решение для генерации модели Swift из сущности Core Data:

В Xcode:

редактор > создать NSManagedOjbect > Нажмите кнопку "Далее" > нажмите кнопку "Далее" > выберите" Swift " Langage > Нажмите кнопку "Create"


Я попробовал Swift langage, создав новый проект Swift на Xcode 6 beta с использованием основных данных.

когда я генерирую свои модели из сущностей моих основных данных, Xcode создает модели Objective-C.

есть ли способ генерировать модель Swift, а не модель Obejctive-C с основными данными ?

спасибо !

6 ответов


давайте посмотрим на путь Objective-C:

человек.h (Header-File)

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString *name;
@end

человек.м (Реализация-Файл)

#import "Person.h"

@implementation Person
@dynamic name;
@end

Свифт

документация, уже включенная в Xcode6-Beta, говорит:

Core Data обеспечивает базовое хранение и реализацию свойств в подклассах класса NSManagedObject. Добавьте атрибут @NSManaged перед каждым определением свойства в подклассе управляемого объекта, который соответствует атрибуту или взаимосвязи в основной модели данных. Как и атрибут @dynamic в Objective-C, атрибут @NSManaged сообщает компилятору Swift, что хранение и реализация свойства будут предоставлены во время выполнения. Однако, в отличие от @dynamic, атрибут @NSManaged доступен только для поддержки основных данных.

Так вот как я бы переписал приведенный выше пример для Swift (не проверено):

человек.Свифт!--7-->

import CoreData

class Person: NSManagedObject {

    @NSManaged var name : NSString

}

и по вашему вопросу я думаю, что подкласс-генерация-функция может быть еще не включена в Xcode6. Вы убедились, что выбрали "Swift" в качестве языка программирования при создании Cocoa-проекта в Xcode?


вы можете получить Swift модель обратно с помощью NSEntityDescription.insertNewObjectForEntityForName но вы должны отредактировать файл модели основных данных и не использовать Person как сущность класса, но <ProjectName>.Person еще он возвращает NSManagedObject...

используя println() вы не увидите Person экземпляр, но что-то вроде <_TtC5ProjectName4Person: 0xc9ad5f0> но вызов методов на этом докажет, что это Person экземпляр по-настоящему. Я думаю, это просто способ для Swift генерировать уникальные имена классов, а не конфликты, и методы CoreData показывают этот внутренний механизм.

в документация Apple говорит:

Swift классы являются пространствами имен-они ограничены модулем (как правило, проектом), в котором они скомпилированы. Чтобы использовать подкласс Swift класса NSManagedObject с основной моделью данных, префикс имя класса в поле класс в инспекторе сущностей модели с именем модуля.


согласно видео Apple относительно того, что нового в CoreData frame: 38mins (Wwdc2014 Session 225), в модели данных инспектора префикс имени класса с именем проекта. Как имя_проекта.Доктор!--4-->

Я пробовал это, но что произойдет, так это то, что сгенерированный класс управляемых объектов станет: имя_проекта.Свифт!--4--> вместо врач.Свифт!--4-->. Даже объявление класса становится имя проекта класса: ManagedObject

устранение:

в инспекторе моделей данных просто укажите имя и класс вашего объекта, какое имя вы хотите,пример: врач

после создания объектной модели и выбора Swift будет создан файл (врач.Свифт!--4-->).

теперь при вставке новых записей в основные данные может возникнуть ошибка "класс не найден, используя NSManagedObject по умолчанию вместо" даже если вы приведете вновь вставленный объект к правильному имени объекта.

чтобы решить эту проблему, нужно просто добавить @objc (имя класса) над объявлением класса. См. образец ниже.

import Foundation
import CoreData

@objc(Doctor)
class Doctor: NSManagedObject {
    @NSManaged var name: String
}

затем:

let doctorManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Doctor", inManagedObjectContext: context) as Doctor
doctorManagedObject.name = "John" // you can now use dot syntax instead of setValue

сохранить контекст для фиксации вставки.


Я тестировал @NSManaged, это не сработало. : (. Но файлы смешанных моделей(.h) созданный xcdatamodel, он преуспевает. пожалуйста, прочитайте документ и код вhttps://github.com/iascchen/SwiftCoreDataSimpleDemo


кроме того, вы можете просто добавить #import "Person.h" в заголовке промежуточного, Project-Bridging-Header.h что Xcode генерирует для вас (если вы приняли это предложение для создания). Затем вы можете использовать все автоматически сгенерированные Obj-C, как если бы это был собственный Swift.


редактор ->Создать Подкласс NSManagedObject отлично работает для Swift

просто выполните все обычные шаги, но когда вы доберетесь до создания файлов, выберите язык "Swift", если это первый раз, когда вы использовали Создать Подкласс NSManagedObject С проектом Swift он будет по умолчанию для Objective C