gpt4 book ai didi

macos - 如何在核心数据中存储非标准持久属性(例如 NSRect)?

转载 作者:行者123 更新时间:2023-11-28 09:12:37 25 4
gpt4 key购买 nike

我正在为我的第一个 Core Data 应用程序苦苦挣扎,并且没有最顺畅的旅程 :o(

我有一个绘图应用程序,它有一个名为 DrawingObject 的基类,它是 NSManagedObject 的子类并且有两个属性:

@NSManaged var frameAsValue: NSValue
var frame: NSRect

DrawingObject 有一个子类 DrawingRectangle。所有的实体都有相应的实体,并设置了完全限定的类名。 frameAsValue 属性被标记为可转换,而 frame 被标记为 Undefined transient。问题是我在创建 DrawingRectangle 时收到 frameAsValue 属性无法识别的选择器错误。

我看到过将 NSRect 转换为字符串以将其保存到 Core Data 的建议,但这似乎容易出错(本地化)和骇人听闻(如果这是一个合适的词;o)。这是 DrawingObject 的代码:

class DrawingObject: NSManagedObject {

@NSManaged var frameAsValue: NSValue

var frame: NSRect = NSZeroRect {
didSet {
frameAsValue = NSValue(rect: frame)
}
}

override func awakeFromInsert() {
frame = NSMakeRect(0, 0, 0, 0)
}

override func awakeFromFetch() {
frame = frameAsValue.rectValue
}
}

我现在假设您必须在每个实体的类层次结构中声明所有继承的属性。我现在没有时间测试这个,但很快就会回来。

最佳答案

您必须将 DrawingRectangle 的父实体设置为 DrawingObject 才能从父实体继承属性(就像在类层次结构中一样)。如果您打算将父实体/父类的不同子类保存到相同的一对多关系中,您还必须设置父子实体关系。

例如,如果您想将 DrawingObjects 的不同子类保存在 @NSManaged var objects: NSSet 中,例如,您必须在实体上设置父关系以对应于您的 NSManagedObject类层次结构。因此,在这种情况下,您可以将 DrawingRectangle 实体的父级设置为 DrawingObject。

否则,通过将 DrawingObject-entity 的 frame-property 设置为 transient 和 optional 并将 frameAsValue 设置为 transformable,将 NSRect 保存为问题中显示的代码。你不应该指定一个 valuetransformer,这样 Core Data 将使用在这种情况下完美工作的默认值转换器。

关于macos - 如何在核心数据中存储非标准持久属性(例如 NSRect)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com