CoreData Swift和临时属性getter [英] CoreData Swift and transient attribute getters
问题描述
有关在Swift中使用Core Data时实现计算属性的任何建议
与生成的ManagedObject类,我试图覆盖getter,但我得到错误: / p>
不允许在计算属性上使用'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
$ b let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit),fromDate:self.timeStamp)
ddtmp =\(components.year * 1000 + components.month)
self.setPrimitiveValue(ddtmp,forKey:dateDue)
}
return ddtmp!
}
}
首先,在数据模型中创建一个临时属性(节
)。因为它是瞬时的,所以它不是物理存储的,因此不存储在管理对象上下文中。
部分
属性如下所示:
实体显示在这里:
>
类NSManagedObject子类应该有计算的'section'属性。 NSManagedObject
子类演示如何完成此操作:
数字:NSManagedObject {
@NS管理的变量号码:NSNumber
var section:String? {
return number.intValue> = 60? Pass:Fail
}
}
sectionForKeyPath
在NSFetchedResultsController初始值设定器中是数据模型中的临时属性键和缓存名称。
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 上找到了一个示例项目。
Any advice on implementing calculated attributes when using Core Data in Swift?
with the generated ManagedObject class, I tried to override the getter but I get the error:
'NSManaged' not allowed on computed properties
which implies you cannot override the getter for a transient (calculated) attribute.
In the code sample below, dateDue
is defined as a transient attribute in my model.
Please note that the @NSManaged lines were generated by Xcode - not added by 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!
}
}
First, in the data model create a transient attribute (section
). Because it is transient, it is not physically stored and thus not stored in the managed object context.
The section
attribute is shown here:
The entity is shown here:
The class NSManagedObject subclass should have computed 'section' attribute. The NSManagedObject
subclass demonstrating how to accomplish this is shown here:
class Number: NSManagedObject {
@NSManaged var number: NSNumber
var section: String? {
return number.intValue >= 60 ? "Pass" : "Fail"
}
}
Then you must set sectionForKeyPath
in the NSFetchedResultsController initializer to be the transient attribute key in the data model and the cache name if desired.
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
}
The result is a UITableViewController
with grades sorted by pass or fail dynamically:
I made a sample project that can be found on GitHub.
这篇关于CoreData Swift和临时属性getter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!