如何在Swift中的NSManagedObject子类中向关系属性添加对象?
在Objective中,当从数据模型在Xcode中生成NSManagedObject子类时,有一个自动生成的类扩展,其中包含如下声明:
@interface MyManagedObject (CoreDataGeneratedAccessors)
- (void)addMySubObject: (MyRelationshipObject *)value;
- (void)addMySubObjects: (NSSet *)values;
@end但是,Xcode目前缺乏Swift类的类生成能力。
如果我试图直接调用Swift对象上的等效方法:
myObject.addSubObject(subObject)...I在方法调用上得到一个编译器错误,因为这些生成的访问器是不可见的。
我已经将relationship属性声明为@NSManaged,如文档中所述。
或者,对于具有关系的数据模型,我必须恢复到objects对象吗?
发布于 2014-06-10 16:54:05
是的,这将不再有效,Swift无法在运行时生成访问器,这样会破坏类型系统。
您需要做的是使用关键路径:
var manyRelation = myObject.valueForKeyPath("subObjects") as NSMutableSet
manyRelation.addObject(subObject)
/* (Not tested) */发布于 2015-11-06 18:56:51
从Xcode 7和SWIFT2.0(参见新闻稿#17583057)开始,您只需将以下定义添加到生成的扩展名文件中:
extension PersonModel {
// This is what got generated by core data
@NSManaged var name: String?
@NSManaged var hairColor: NSNumber?
@NSManaged var parents: NSSet?
// This is what I manually added
@NSManaged func addParentsObject(value: ParentModel)
@NSManaged func removeParentsObject(value: ParentModel)
@NSManaged func addParents(value: Set<ParentModel>)
@NSManaged func removeParents(value: Set<ParentModel>)
}这起作用是因为
NSManaged属性可以与方法和属性一起使用,用于访问符合-许多访问器的核心数据的自动生成的密钥值编码。
添加此定义将允许您向集合中添加项。不知道为什么这些不是自动生成的..。
发布于 2014-06-30 19:39:19
目标C中的核心数据自动创建setter方法(1):
默认情况下,Core数据动态地为托管对象类的建模属性(属性和关系)创建高效的公共和原始获取和设置访问器方法。这包括键值编码可变代理方法,如addObject:和removes:,如mutableSetValueForKey:-托管对象的文档中详细介绍的那样,托管对象实际上是所有到多个关系的可变代理。
就目前Xcode6-Beta2中的Swift而言,您必须自己实现这些访问器。例如,如果您有一个无序到多个关系,从Way到Node,您可以这样实现addNodesObject:
class Way : NSManagedObject {
@NSManaged var nodes : NSSet
func addNodesObject(value: Node) {
self.mutableSetValueForKey("nodes").addObject(value)
}
}这里的关键是您必须使用mutableSetValueForKey / mutableOrderedSetValueForKey / mutableArrayValueForKey。在这些集合/数组上,您可以调用addObject,它们将存储在下一次刷新中。
https://stackoverflow.com/questions/24146524
复制相似问题