2015-08-30 35 views
2

所以,我有以下实体:核心数据:设置的NSSet斯威夫特

class Person: NSManagedObject { 
    @NSManaged var name: String 
    @NSManaged var dogs: NSSet 
} 

class Dog: NSManagedObject { 
    @NSManaged var name: String 
    @NSManaged var owner: NSManagedObject 
} 

而且我觉得我必须试着像五种不同的方法来设置狗的NSSet和业主NSManagedObject,都没有运气。

self.mutableSetValueForKey("dogs").addObject(newDog) 

崩溃和投掷 “终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因: '*** - [NSSet中intersectsSet:]:设定参数不是一个NSSet中'”

我都试过这些选项中的一个:

var newDogs = [newDog] 
var setOfDogs = NSSet(array: newDogs) as Set<NSObject>  
self.dogs.setByAddingObjectsFromSet(setOfDogs) 
self.dogs.setByAddingObjectsFromArray(newDogs) 

这两者都没有引发异常,但self.dogs在使用这两者之后是空的。

另外,当设置dog.owner时,我该怎么做?我知道有一些方法是dog.owner.setValue(Value,Key),但我不确定这个值和key是指什么,并且文档没有超级有用。

我知道这里有一些类似的问题,但它们都在Obj-C中,我无法遵循它们。任何建议表示感谢,谢谢!

回答

2

首先,如果你继承NSManagedObject,你应该使用子类:

@NSManaged var owner : Person 

其次,你不必关心设置在一个一对多NSSet关系的复杂性。相反,只需设置为一对一的关系。

dog.owner = person 

就是这样。

最后,为了将来的参考,这里是你如何设置/修改NSSet。当你有多对多的关系时,这是必要的。

let items = self.mutableSetValueForKey("dogs") 
items.addObject(newDog) 

您可以通过添加方便的方法来你NSManagedObject子类简化此。

+0

为什么不是“mutableCopy”?只是为了避免可能的编译错误 – Gabox

+0

你不想要一个副本。您不应该试图欺骗编译器,而是让它帮助您编写稳定,高效且经济的代码。 – Mundi

+0

这使我的应用程序崩溃:[_SwiftValue实体]:无法识别的选择器发送到实例 –