如何在NSManagedObject子类中使用Transformable属性作为其实际类型?

时间:2016-01-19 07:02:48

标签: cocoa core-data nsmanagedobject

刚开始一个项目。数据模型文件具有一个实体,该实体具有可转换的单个属性。它应该是NS/CGRect。我让Xcode创建了相应的NSManagedObject子类文件。对于“MyThing.swift”,我得到了:

import Foundation
import CoreData

class MyThing: NSManagedObject {
// Insert code here to add functionality to your managed object subclass
}

我得到了一个“MyThing + CoreDataProperties.swift”:

import Foundation
import CoreData

extension MyThing {
    @NSManaged var myBounds: NSObject?
}

我希望该属性为实际CGRect,因此我需要一个NSData <-> NSValue <-> NSRect转换链。我已经将“NSKeyedUnarchiveFromDataTransformer”作为Interface Builder中属性类型下的名称。我应该添加(和/或更改)以传递CGRect值?

或者我不这样做,只是通过NSValue - 包裹CGRect而不是? (我希望CoreData能够处理任何NSData <-> NSValue转换。)

2 个答案:

答案 0 :(得分:0)

因为CGRect不是类而是结构我建议创建另一个属性,该属性将通过适当的转换访问原始变量。然后只使用该属性。

class MyThing {
    var boundsValue : NSValue?

}

extension MyThing {
    var bounds : CGRect {
        get {
            if let value = boundsValue {
                value.CGRectValue()
            }
            return CGRectNull
        }
        set {
            boundsValue =  NSValue(CGRect: newValue)
        }
    }
}

答案 1 :(得分:0)

只要您的可转换类型符合NSCoding,Core Data就会为您处理剩下的事情。我在NSAttributedString中使用了NSManagedObjects,并且只更改了在运行时生成的提供id的CoreData类型。

如果您想拥有自己类型的属性,即MyAwesomeObject,请确保实施initWithCoder:encodeWithCoder:

因此,对于您的情况,为了使用CoreData存储CGRects,您需要将它们包装在实现上述方法的类中。这是因为CGRect不符合NSCoding协议,因此不能直接存储为可转换属性。

您的其他选择当然是将xywidthheight存储为属性,并且具有您在{{1}中计算的瞬态属性}和awakeFromFetch或只是一种方便的方法。