在CoreData中,我定义了从 Node
到 Tag
的无序to-many关系 . 我已经创建了一个像这样的Swift实体:
import CoreData
class Node : NSManagedObject {
@NSManaged var tags : Array<Tag>
}
现在我想将 Tag
添加到 Node
的实例中,如下所示:
var node = NSEntityDescription.insertNewObjectForEntityForName("Node", inManagedObjectContext: managedObjectContext) as Node
node.tags.append(tag)
但是,这失败并出现以下错误:
由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'to-many关系的值不可接受的类型:property =“tags”;期望的类型= NSSet;给定type = _TtCSs22ContiguousArrayStorage000000000B3440D4; value =(“<_TtC8MotorNav3Tag:0xb3437b0>(entity:Tag; id:0xb343800; data:)”) . '
多对多关系的正确类型是什么?
4 回答
为了能够在Swift中使用一对多关系,您需要将属性定义为:
如果您尝试使用
NSMutableSet
更改将不会保存在CoreData中 . 当然,建议在Node
中定义反向链接:但是Swift仍然无法在运行时生成动态访问器,因此我们需要手动定义它们 . 在类
extension
中定义它们并放入Entity+CoreData.swift
文件非常方便 . 贝娄是Node+CoreData.swift
文件的内容:用法:
Important: 要使一切正常,您应该验证CoreData模型中实体的类名是否包含您的模块名称 . 例如 .
MyProjectName.Node
从Xcode 7和Swift 2.0开始,release note 17583057指出:
所以你只需声明以下方法,CoreData将负责其余的工作:
实际上你可以定义:
并直接使用
Set
的insert
和remove
方法 .基于@Kenenle的答案,如果你想要厚颜无耻,能够说出来
可以将调用包装到self.mutableSetValueForKey: