14

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

我查了好几页。我想在 Swift 中使用通用的 NSOrderedSet 的通用版本。

使用 Set 你可以这样做:

Swift 的 Set 类型桥接到 Foundation 的 NSSet 类。资料来源:Apple Docs - 集

在 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]

来源:Apple Docs - 轻量级泛型

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

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

4

2 回答 2

9

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

但有时,它很有用。因此,您不必自己对数据进行排序。特别是当您有一个包含子实体列表的实体时,它们不会被排序,因为它是一个集合。然后您必须创建一个数组以按特定顺序准备数据,因为普通集不会保持其顺序。因此,对于核心数据,它在与 NSFetchedResultsController 一起使用时特别有用。

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

当您使用NSFetchedResultsController它时,它完全没用,因为它会NSFetchedResultsController为您订购一切。

于 2016-04-25T15:45:18.833 回答
0

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

即使对于 Apple 来说,有序集在 Core Data 中也是二等公民,但它们在 iCloud Core Data 存储中不受支持(尽管该系统普遍存在问题,我相信它现在已被普遍弃用)。

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

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

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

于 2016-07-12T23:34:10.187 回答