刚开始一个项目。数据模型文件具有一个实体,该实体具有可转换的单个属性。它应该是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
转换。)
答案 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协议,因此不能直接存储为可转换属性。
您的其他选择当然是将x
,y
,width
,height
存储为属性,并且具有您在{{1}中计算的瞬态属性}和awakeFromFetch
或只是一种方便的方法。