Swift 2.0 一对多的关系——仍然是 NSOrderedSet?

Posted

技术标签:

【中文标题】Swift 2.0 一对多的关系——仍然是 NSOrderedSet?【英文标题】:Swift 2.0 one-to-many relationship - still NSOrderedSet? 【发布时间】:2015-08-21 01:38:02 【问题描述】:

在 Swift 2.0 中,Core Data 中的一对多关系仍然是 NSOrderedSets 吗?

我似乎无法适当地进行转换/向下转换,以免引发错误。

有人在 Swift 2.0 中有一个简单的例子吗?

【问题讨论】:

【参考方案1】:

仅当您使用“有序”选项标记关系时。如果没有,那就是NSSet

我不同意接受的答案,因为在 Swift 2.0 中,从 NSSetSet 的桥接会自动发生,因此如果您可以将 CoreData 实体子类化,则只需编写:

@NSManaged var oneToManyOfTypeFoo: Set<Foo>

然后添加和删除元素变得微不足道,因为您可以使用 Set 中的 insertremove 方法。

【讨论】:

当你选择了有序选项时,Xcode 会自动添加 NSOrderedSet 而不是 NSSet,并且你不能将 与 NSOrderedSet 一起使用。如何使用 Set 处理订单相关操作?谢谢... NSOrderedSet 是不同的结构,不能转换为 Set。我看到你有两个选择:第一个是坚持NSOrderedSet,所以我的回答与你无关。另一种是取消选择有序选项并使用Set。然后就可以排序了:myset.sorted(by:)【参考方案2】:

不幸的是,使用 swift 的 CoreData 仍然是一个巨大的痛苦,尤其是在有序的一对多关系中。是的,CoreData 仍然将 NSOrderedSet 用于多对多关系。问题是如何添加/删除项目。到目前为止,Xcode 从未能够为有序集正确生成访问器——即使在 Objective 中,更不用说 Swift 了!

在 Swift 中保存多对多关系有这个线程: How to define CoreData relationship in Swift?

但是,唉!在 Swift 2.0 世界中,这个线程中没有提到任何东西。那么目前的解决方法是什么?我对此进行了深入研究,获得此工作的唯一方法是在Objective C中为有问题的实体生成源代码,而不是在swift中并在桥接头中导出它们的标头。此外,您需要确保为 Xcode 包含一个重要的解决方法,以便为有序集生成正确的访问器:

https://github.com/CFKevinRef/KCOrderedAccessorFix

您应该确保致电- model.kc_generateOrderedSetAccessors() 在 AppDelegate 中的模型创建代码中调用此修复程序。

完成后,您现在可以安全地开始在模型上使用生成的访问器将项目添加到一对多关系中。

我创建了一个示例项目并在 github 中,希望对您有所帮助-

https://github.com/shripada/CoreDataToManyRelationshipInSwift2.0

【讨论】:

事实证明它在 XCode 7 beta 5 中变得更简单了。Core Data 现在使用 NSSet 来处理一对多关系。创建一个 NSMutableSet,例如“let clientSet: NSMutableSet = []”,然后将一个 Core Data 对象添加到集合“clientsSet.addobject(aClientObject)”,然后将该集合放入“event.clients = clientsSet”这样的关系中,然后你'重做。我所要做的就是重新生成我不起作用的类(比如我的事件)。我仍在使用从 XCode 7 beta 4 中的核心数据生成的一些类,这让我很困惑(事件使用的是 NSOrderedSet 而不是 NSSet)。

以上是关于Swift 2.0 一对多的关系——仍然是 NSOrderedSet?的主要内容,如果未能解决你的问题,请参考以下文章

一对多关系CoreData Swift

Realm Swift 选择与一对多关系实体中的一个字段匹配的所有值

Swift如何实现通用类型的弱引用数组(下)

Swift如何实现通用类型的弱引用数组(上)

Swift如何实现通用类型的弱引用数组(下)

Swift - 一对多排序