Swift:CoreData和通用的NSOrderedSet

时间:2016-04-25 09:55:43

标签: ios swift generics core-data nsorderedset

我不确定我是否发现了任何信息,或者是否无法获取信息。

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

使用Set你可以这样做:

  

Swift的Set类型桥接到Foundation的NSSet类。资料来源: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]
  

来源:Apple Docs - Lightweight Generics

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

是否有可能在Swift的集合中定义订单?

2 个答案:

答案 0 :(得分:10)

不,Swift中没有有序的设置,说实话,你不应该使用有序的设定期限。它们很少使用。

  

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

这是核心数据的一个懒惰的补充,从来没有发生过。它比编写自己的排序例程更有用或更高效。在子类中编写便捷方法以生成有序数组比使用NSOrderedSet更快,更高效。

当您使用NSFetchedResultsController时,由于NSFetchedResultsController为您下达了所有内容,因此完全没用。

答案 1 :(得分:0)

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

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

在Swift术语中,可以使用值语义编写自己的有序集,但此时不可能启用与基础有序集之间的桥接。

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

总之,有些方法可以做到,但这并不意味着你应该这样做。