CoreData Swift和临时属性getter [英] CoreData Swift and transient attribute getters

查看:163
本文介绍了CoreData Swift和临时属性getter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有关在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆