问题 Swift:CoreData和通用的NSOrderedSet


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

我查了几页。我想在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中定义一个订单?


5328
2018-04-25 09:55


起源



答案:


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

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

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

当你使用时 NSFetchedResultsController 它完全没用了 NSFetchedResultsController 为您订购一切。


11
2018-04-25 15:45



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


答案:


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

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

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

当你使用时 NSFetchedResultsController 它完全没用了 NSFetchedResultsController 为您订购一切。


11
2018-04-25 15:45



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


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

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

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

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

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


0
2017-07-12 23:34