如何在Swift中分配CoreData多对多的关系?

我有一个NSManagedObject类

class Disease: NSManagedObject { @NSManaged var diseaseId: String @NSManaged var diseaseName: String @NSManaged var dogBreed: NSSet } 

如何添加一个新的关系dogBreed? 如果我更改vartypes为NSMutableSet,更改不保存到数据库。 有任何想法吗?

从Xcode 7和Swift 2.0开始, 发行说明 17583057指出:

NSManaged属性可以与方法和属性一起使用,以访问Core Data自动生成的Key-Value-Coding兼容的多对多访问器。

 @NSManaged var employees: NSSet @NSManaged func addEmployeesObject(employee: Employee) @NSManaged func removeEmployeesObject(employee: Employee) @NSManaged func addEmployees(employees: NSSet) @NSManaged func removeEmployees(employees: NSSet) 

这些可以在NSManagedObject子类中声明。 (17583057)

所以你只需要声明下面的方法,CoreData将负责其余的部分:

 @NSManaged func addDogBreedsObject(dogBreed: DogBreed) @NSManaged func removeDogBreedsObject(dogBreed: DogBreed) @NSManaged func addDogBreeds(dogBreeds: NSSet) @NSManaged func removeDogBreeds(dogBreeds: NSSet) 

由于严格的types系统,Swift不能生成dynamic运行时访问器。 您可以创build一个扩展到Disease类,并手动添加错过的方法,这里是代码:

 extension Disease { func addDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.addObject(value) } func removeDogBreedObject(value:DogBreed) { var items = self.mutableSetValueForKey("dogBreed"); items.removeObject(value) } } 

备注:

我build议你为扩展名为Disease+CoreData.swift创build单独的文件,当你重新生成CoreData模型时,这应该有助于保持代码免于覆盖。

在一个被pipe理的对象中创build关系就足够了,第二个将被反向引用更新。 (与Objective-C一样)

重要提示:为了完成所有工作,您应该validationCoreData模型中的实体类名是否包含模块名称。 例如MyProjectName.Disease

答案启发: 在Swift中设置一个NSManagedObject关系

如果你正在寻找一个简单的方法就使用这个。

 import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { var items = self.mutableSetValueForKey(forKey); items.addObject(value) } } 

执行:

 department.addObject(section, forKey: "employees") 

而不是每个需要它的NSManageObject类编写相同的方法。

其实你可以写:

 @NSManaged var dogBreed: Set<DogBreed> 

并直接使用Setinsertremove方法。

作为@Naz的扩展。 结合@Ash的评论。 我发现了唯一的xCode 6.3.1工作解决scheme

 import CoreData extension NSManagedObject { func addObject(value: NSManagedObject, forKey: String) { self.willChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) var items = self.mutableSetValueForKey(forKey); items.addObject(value) self.didChangeValueForKey(forKey, withSetMutation: NSKeyValueSetMutationKind.UnionSetMutation, usingObjects: NSSet(object: value) as Set<NSObject>) } } 

您必须调用willChange和didChange处理程序才能在Swift中正确添加对象到多对多关系。

 myManagedObject.addObject(value, forKey: "yourKey") 

@Nycen有现在自动实现的方法的Xcode 7的最佳解决scheme,但请注意, NSOrderedSet问题几乎难以置信地仍然存在(请参阅此问题 ),所以如果使用NSOrderedSet而不是NSSet您的关系,您仍然需要使用一个解决方法。

(我会评论,而不是张贴一个新的答案,但我缺乏点)

如果您需要使用NSOrderedSet而不是NSSet ,我一直在使用下面的代码,这使得更容易获取NSMutableOrderedSet方法来添加,插入和删除对象。

 @NSManaged private var myOrderedSet: NSOrderedSet var myMutableOrderedSet: NSMutableOrderedSet { return self.mutableOrderedSetValueForKey("myOrderedSet") }