首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中设置NSManagedObject关系

在Swift中设置NSManagedObject关系
EN

Stack Overflow用户
提问于 2014-06-10 16:43:06
回答 8查看 23.3K关注 0票数 35

如何在Swift中的NSManagedObject子类中向关系属性添加对象?

在Objective中,当从数据模型在Xcode中生成NSManagedObject子类时,有一个自动生成的类扩展,其中包含如下声明:

代码语言:javascript
复制
@interface MyManagedObject (CoreDataGeneratedAccessors)

     - (void)addMySubObject: (MyRelationshipObject *)value;
     - (void)addMySubObjects: (NSSet *)values;

@end

但是,Xcode目前缺乏Swift类的类生成能力。

如果我试图直接调用Swift对象上的等效方法:

代码语言:javascript
复制
myObject.addSubObject(subObject)

...I在方法调用上得到一个编译器错误,因为这些生成的访问器是不可见的。

我已经将relationship属性声明为@NSManaged,如文档中所述。

或者,对于具有关系的数据模型,我必须恢复到objects对象吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-06-10 16:54:05

是的,这将不再有效,Swift无法在运行时生成访问器,这样会破坏类型系统。

您需要做的是使用关键路径:

代码语言:javascript
复制
var manyRelation = myObject.valueForKeyPath("subObjects") as NSMutableSet
manyRelation.addObject(subObject)
/* (Not tested) */
票数 34
EN

Stack Overflow用户

发布于 2015-11-06 18:56:51

从Xcode 7和SWIFT2.0(参见新闻稿#17583057)开始,您只需将以下定义添加到生成的扩展名文件中:

代码语言:javascript
复制
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属性可以与方法和属性一起使用,用于访问符合-许多访问器的核心数据的自动生成的密钥值编码。

添加此定义将允许您向集合中添加项。不知道为什么这些不是自动生成的..。

票数 49
EN

Stack Overflow用户

发布于 2014-06-30 19:39:19

目标C中的核心数据自动创建setter方法(1):

默认情况下,Core数据动态地为托管对象类的建模属性(属性和关系)创建高效的公共和原始获取和设置访问器方法。这包括键值编码可变代理方法,如addObject:和removes:,如mutableSetValueForKey:-托管对象的文档中详细介绍的那样,托管对象实际上是所有到多个关系的可变代理。

就目前Xcode6-Beta2中的Swift而言,您必须自己实现这些访问器。例如,如果您有一个无序到多个关系,从WayNode,您可以这样实现addNodesObject

代码语言:javascript
复制
class Way : NSManagedObject {
    @NSManaged var nodes : NSSet

    func addNodesObject(value: Node) {
        self.mutableSetValueForKey("nodes").addObject(value)
    }
}

这里的关键是您必须使用mutableSetValueForKey / mutableOrderedSetValueForKey / mutableArrayValueForKey。在这些集合/数组上,您可以调用addObject,它们将存储在下一次刷新中。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24146524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档