Где реализовать NSValueTransformer для основных данных в Swift

Я пытаюсь поместить объекты в хранилище Core Data, каждый из которых имеет нестандартные типы данных: один — NSDocument, а другой — NSURL. Я понимаю, что в .xcdatamodeld мне нужно объявить их как трансформируемые. И я думаю, мне нужно добавить что-то, что реализует NSValueTransformer, чтобы превратить их в NSData (... или есть преобразователь по умолчанию, который сделает это автоматически?)

Я думаю, что на вопрос должен быть простой ответ: где мне это реализовать? Я не нашел явного примера этого в Swift. Существует пример Objective-C, но разделение .h и .m файлы не дают мне понять, куда это пойдет в Swift.

Предположим, у меня есть тип объекта с именем Notebook с атрибутом folderURL — типа Transformable в базе данных и типа NSURL в фактической переменной. (Я использую это в качестве примера, потому что это проще — пожалуйста, не говорите мне просто преобразовать NSURL в строку, потому что это не будет работать для другого трансформируемого.)

Вопрос: куда мне поместить NSValueTransformer для URL-адреса папки, если он мне нужен? Должен ли Notebook реализовать это? Должны ли Notebook+CoreDataProperties? Или мне нужен отдельный подкласс с именем FolderURL, который его реализует, и если да, то как мне обратиться к этому подклассу обратно в Notebook (и/или Notebook+CoreDataProperties)?

(Был более ранний вопрос с похожим заголовком, но они, кажется, уже продвинулись немного дальше - они не спрашивают и не демонстрируют "где".)


person Displaced Hoser    schedule 15.07.2016    source источник


Ответы (1)


«Где» находится в любом месте вашего проекта. Где угодно, что гарантирует, что ваш подкласс NSValueTransformer будет существовать во время выполнения. Реализуйте подкласс NSValueTransformer и введите имя класса в модели Core Data в качестве преобразователя значений.

Однако есть преобразователь по умолчанию. Любой класс, использующий протокол NSCoding, может быть автоматически преобразован Core Data. В этом случае вы помечаете атрибут как преобразуемый, но не включаете имя класса. Это включает NSURL, поэтому вам не нужно преобразовывать его или преобразовывать в строку.

Тогда для вашего подкласса NSDocument у вас есть возможность либо реализовать NSCoding в классе, либо реализовать подкласс NSValueTransformer для типа документа.

person Tom Harrington    schedule 15.07.2016