关于在 Swift 中使用 Core Data 时实现计算属性的任何建议?
使用生成的 ManagedObject 类,我试图重写 getter 但出现错误:
'NSManaged' not allowed on computed properties
这意味着您不能覆盖 transient (计算)属性的 getter。
在下面的代码示例中,dateDue
在我的模型中被定义为 transient 属性。
请注意,@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!
}
}
最佳答案
首先,在数据模型中创建一个 transient 属性(section
)。因为它是 transient 的,所以它没有物理存储,因此也没有存储在托管对象上下文中。
section
属性如下所示:
实体显示在这里:
类 NSManagedObject 的子类应该具有计算的“section”属性。 NSManagedObject
子类演示了如何完成此操作,如下所示:
class Number: NSManagedObject {
@NSManaged var number: NSNumber
var section: String? {
return number.intValue >= 60 ? "Pass" : "Fail"
}
}
然后您必须将 NSFetchedResultsController 初始化器中的 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 上找到.
关于core-data - CoreData Swift 和 transient 属性 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960555/