Swift:CoreData 和通用 NSOrderedSet

Swift: CoreData and generic NSOrderedSet

我不确定我是没有找到任何信息还是不可能。

我查了好几页。我想在 Swift.

中使用 NSOrderedSet 的通用版本

使用 Set 可以做到这一点:

Swift’s Set type is bridged to Foundation’s NSSet class. Source: Apple Docs - Sets

在 NSManagedObject 子类中,您只需将 NSSet 更改为 Set 即可。 (测试过)

@property NSArray<NSDate *> *dates;
@property NSSet<NSString *> *words;
@property NSDictionary<NSURL *, NSData *> *cachedData;

var dates: [NSDate]
var words: Set<String>
var cachedData: [NSURL: NSData]

Source: Apple Docs - Lightweight Generics

但我在 Swift 中找不到任何对有序集的引用。我可以使用 Objective-C 中的 NSOrderedSet 但我不会在 Swift 中使用泛型。

是否可以在 Swift 中定义一个集合中的顺序?

不,Swift 中没有有序集,老实说,您不应该使用有序集周期。它们很少被使用。

But some times, its useful. So you don't have to sort your data by yourself. Especially when you have an entity with a list of sub entities they won't be sorted because it is a set. And then you would have to create a array to have the data prepared in a specific order because a plain set doesn't keep its order. So for core data it is useful especially in use with the NSFetchedResultsController.

这是对 Core Data 的懒惰添加,本不应该发生。它永远不会比编写您自己的排序例程更有用或更高效。在子类中编写一个方便的方法来生成有序数组将比使用 NSOrderedSet 更快、更高效。

当您使用 NSFetchedResultsController 时,它完全没用,因为 NSFetchedResultsController 会为您订购所有东西。

我同意 Marcus Zarra 的回答,它通常不是一个值得使用但想添加一些东西的功能。我通常建议为您可以排序的显式顺序值添加 属性。

Ordered Sets 是 Core Data 中的第二个 class 公民,即使对于 Apple,iCloud Core Data 存储也不支持它们(尽管该系统通常存在问题,我相信它现在已被普遍弃用)。

在 Swift 术语中,可以使用值语义编写您自己的有序集,但此时无法启用与 Foundation 有序集的桥接。

如果您真的非常想支持它,您可以编写一个自定义代码生成器来为您的自定义有序集类型创建访问器(或者只是手动添加访问器)。

总而言之,您可以通过多种方式做到这一点,但这并不意味着您应该这样做。