CoreData Getter di attributo Swift e transient

Qualche consiglio sull’implementazione degli attributi calcolati quando si utilizzano i Core Data in Swift?

con la class ManagedObject generata, ho provato a sovrascrivere il getter ma ottengo l’errore:

‘NSManaged’ non consentito sulle proprietà calcolate

il che implica che non è ansible sovrascrivere il getter per un attributo transitorio (calcolato).

Nell’esempio di codice riportato di seguito, dateDue è definito come un attributo transitorio nel mio modello.

Si noti che le linee @NSManaged sono state generate da Xcode, non aggiunte da me.

 @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! } } 

Innanzitutto, nel modello dati crea un attributo transitorio ( section ). Poiché è temporaneo, non viene fisicamente memorizzato e quindi non memorizzato nel contesto dell’object gestito.

L’attributo della section è mostrato qui:

inserisci la descrizione dell'immagine qui

L’ quadro è mostrata qui:

inserisci la descrizione dell'immagine qui

La sottoclass class NSManagedObject deve avere attributo ‘sezione’ calcolato. La sottoclass NSManagedObject mostra come ottenere ciò è mostrata qui:

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

Quindi, è necessario impostare sectionForKeyPath nell’inizializzatore NSFetchedResultsController come chiave dell’attributo temporaneo nel modello di dati e, se lo si desidera, il nome della cache.

 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 } 

Il risultato è un UITableViewController con gradi ordinati per passa o fallisce dynamicmente:

inserisci la descrizione dell'immagine qui

Ho creato un progetto di esempio che può essere trovato su GitHub .

“Transient” e “computed” nel senso che intendi sono cose diverse e si escludono a vicenda.

Transitorio significa che il valore è memorizzato nella memoria sul grafico dell’object. Calcolato significa che il valore non è memorizzato da nessuna parte e viene calcolato nel getter. Entrambi sono distinti dal classico attributo non transitorio che è memorizzato sul grafico dell’object e viene salvato su disco.

@NSManaged può essere applicato solo agli attributi che hanno uno slot nel modello di object gestito.

Rimuovere l’attributo NSManaged .