Получатели CoreData Swift и переходные атрибуты

Любые советы по реализации рассчитанных атрибутов при использовании Core Data в Swift?

с созданным classом ManagedObject, я попытался переопределить getter, но получаю ошибку:

«NSManaged» не разрешен для вычисляемых свойств

что подразумевает, что вы не можете переопределить геттер для переходного (рассчитанного) атрибута.

В приведенном ниже примере кода dateDue определяется как переходный атрибут в моей модели.

Обратите внимание, что @NSManaged линии были созданы Xcode – не добавлены мной.

 @NSManaged var timeStamp: NSDate @NSManaged var dateDue: String { get { self.willAccessValueForKey("dateDue") var ddtmp = self.primitiveValueForKey("dateDue") as String? self.didAccessValueForKey("dateDue") if (ddtmp == nil) { let calendar = NSCalendar.currentCalendar() let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit ) , fromDate: self.timeStamp) ddtmp = "\(components.year * 1000 + components.month)" self.setPrimitiveValue(ddtmp, forKey: "dateDue") } return ddtmp! } } 

Во-первых, в модели данных создайте переходный атрибут ( section ). Поскольку он является временным, он физически не хранится и, следовательно, не сохраняется в контексте управляемого объекта.

Атрибут section показан здесь:

введите описание изображения здесь

Объект показан здесь:

введите описание изображения здесь

Подclass classа NSManagedObject должен иметь вычисленный атрибут «section». Подclass NSManagedObject демонстрирующий, как это сделать, показан здесь:

 class Number: NSManagedObject { @NSManaged var number: NSNumber var section: String? { return number.intValue >= 60 ? "Pass" : "Fail" } } 

Затем вы должны установить sectionForKeyPath в инициализаторе sectionForKeyPath в качестве ключа переходного атрибута в модели данных и имени кеша, если это необходимо.

 override func viewDidLoad() { super.viewDidLoad() fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: "section", cacheName: "Root") fetchedResultsController?.delegate = self fetchedResultsController?.performFetch(nil) tableView.reloadData() } func fetchRequest() -> NSFetchRequest { var fetchRequest = NSFetchRequest(entityName: "Number") let sortDescriptor = NSSortDescriptor(key: "number", ascending: false) fetchRequest.predicate = nil fetchRequest.sortDescriptors = [sortDescriptor] fetchRequest.fetchBatchSize = 20 return fetchRequest } 

Результатом является UITableViewController с оценками, отсортированными по проходу или сбой динамически:

введите описание изображения здесь

Я сделал образец проекта, который можно найти на GitHub .

«Переходные» и «вычисленные» в том смысле, что вы имеете в виду разные вещи и взаимоисключающие.

Transient означает, что значение сохраняется в памяти на графе объектов. Вычисление означает, что значение не хранится нигде и рассчитывается в геттере. Оба они отличаются от classического атрибута non-transient, который хранится на графике объекта и сохраняется на диске.

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

Удалите атрибут NSManaged .

Давайте будем гением компьютера.