ios - 在 Swift 中设置 NSManagedObject 关系

标签 ios macos core-data swift nsmanagedobject

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

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

@interface MyManagedObject (CoreDataGeneratedAccessors)

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

@end

但是,Xcode 目前缺少为 Swift 类生成此类的能力。

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

myObject.addSubObject(subObject)

...我在方法调用时遇到编译器错误,因为这些生成的访问器不可见。

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

或者对于具有关系的数据模型,我是否必须恢复为 Objective-C 对象?

最佳答案

从 Xcode 7 和 Swift 2.0 开始(参见 release note #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>)
}

这是可行的,因为

The NSManaged attribute can be used with methods as well as properties, for access to Core Data’s automatically generated Key-Value-Coding-compliant to-many accessors.

添加此定义将允许您将项目添加到您的集合中。不确定为什么这些不只是自动生成...

关于ios - 在 Swift 中设置 NSManagedObject 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24146524/

相关文章:

ios - WatchKit 核心数据同步

ios - 如何在另一个 ViewController 中将带有 Xib 的 ViewController 显示为 subview

ios - IOS从AWS S3下载图像

ios - UIView subview 向前触摸

macos - 将Mac Osx上的Docker端口公开到其他计算机

objective-c - 使用 NSTask 运行 shell 脚本会导致 posix_spawn 错误

macos - NSBox 和自动布局

iOS 核心数据分组方式

html - 在 ios 上禁用 html Canvas 绘图的滚动/滑动操作

arrays - 如何在 Core Data 中存储一组自定义(和重复)对象?