2016-01-19 5 views
0

Просто начать проект. Файл модели данных имеет одну сущность, которая имеет один атрибут Transformable. Предполагается, что это NS/CGRect. Я создал Xcode соответствующие NSManagedObject файлы подкласса. Для "MyThing.swift", я получил:Как я могу использовать атрибут Transformable как его фактический тип в подклассе NSManagedObject?

import Foundation 
import CoreData 

class MyThing: NSManagedObject { 
// Insert code here to add functionality to your managed object subclass 
} 

И я получил "MyThing + CoreDataProperties.swift":

import Foundation 
import CoreData 

extension MyThing { 
    @NSManaged var myBounds: NSObject? 
} 

Я хочу свойство быть фактическим CGRect, поэтому мне нужно NSData <-> NSValue <-> NSRect изменение цепь. У меня уже есть «NSKeyedUnarchiveFromDataTransformer» как имя под типом атрибута в построителе интерфейса. Что я могу добавить (и/или изменить), чтобы передать значения CGRect?

Или я не делаю этого, а просто пропущу NSValue -объявленный CGRect? (Я надеюсь, что CoreData позаботится о любых преобразованиях NSData <-> NSValue.)

+0

Я пошел с освобождением от подкласса (и расширения) и передал непосредственно '' NSValue'-wrapped 'CGRect'. Я все еще удивляюсь, какая лучшая идея, в случае, если мне нужно снова разобраться с этим. – CTMacUser

ответ

0

Поскольку CGRect не является классом, но struct я бы предложил создать другое свойство, которое будет обращаться к необработанной переменной с надлежащими преобразованиями. И тогда используйте только это свойство.

class MyThing { 
    var boundsValue : NSValue? 

} 

extension MyThing { 
    var bounds : CGRect { 
     get { 
      if let value = boundsValue { 
       value.CGRectValue() 
      } 
      return CGRectNull 
     } 
     set { 
      boundsValue = NSValue(CGRect: newValue) 
     } 
    } 
} 
0

До тех пор, пока ваш преобразуемый тип соответствует NSCoding, Core Data позаботится обо всем остальном. Я использовал NSAttributedString в своем NSManagedObjects и только изменил предоставленный CoreData код id, который был сгенерирован во время выполнения.

Если вы хотите приобрести недвижимость по своему собственному типу, то есть MyAwesomeObject, тогда убедитесь, что вы реализуете initWithCoder: и encodeWithCoder:.

Итак, для вашего случая, чтобы хранить CGRects с CoreData, вам необходимо обернуть их в класс, который реализует вышеупомянутые методы. Это связано с тем, что CGRect не соответствует протоколу NSCoding и, следовательно, не может быть сохранен непосредственно в качестве преобразуемого атрибута.

другое Ваш вариант, конечно, хранить x, y, width, height как свойства, и либо иметь переходную Wich свойство вы вычисляете в awakeFromFetch и awakeFromInsert или просто метод удобства.

+0

'awakeFromNib'? Вы имеете в виду 'awakeFromFetch' и' awakeFromSnapshotEvents'? – Willeke

+0

Бах. Опечатка. Я имел в виду 'awakeFromFetch'. Исправлено! Спасибо, что заметили! –

+0

Я обертываю значения 'CGRect' внутри объектов NSValue. Мне интересно, что Apple имела в виду для реализации нестандартных постоянных атрибутов, таких как «NSColor» или «NSRect» (через подкласс или иначе). Может быть, есть пример кода .... – CTMacUser