2016-04-25 326 views
11

我不确定我是否没有找到任何信息或者它是不可能的。Swift:CoreData和generic NSOrderedSet

我抬头看了几页。我想在Swift中使用通用的NSOrderedSet的通用版本。

了一组你可以这样做:

斯威夫特的集类型为桥接至基金会的NSSet类。来源:Apple Docs - Sets

在NSManagedObject子类中,您可以简单地将NSSet更改为设置,它将工作。 (测试过)

@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

但我找不到在斯威夫特的有序集合任何引用。我可以使用Objective-C中的NSOrderedSet,但是我不会在Swift中使用泛型。

有没有可能在Swift中定义一个集合中的订单?

回答

10

不,不存在Swift中的有序集合,并且诚实地说,您不应该使用有序集合时期。它们很少被使用。

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

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

当您使用NSFetchedResultsController时,它是完全无用的,因为NSFetchedResultsController为您指定了所有内容。

+2

但有些时候,它很有用。所以你不必自己分类你的数据。特别是当你有一个具有子实体列表的实体时,它们将不会被排序,因为它是一个集合。然后,您将不得不创建一个数组,以按特定顺序准备数据,因为普通集不会保持其顺序。所以对于核心数据来说,它尤其适用于NSFetchedResultsController。 – Maik639

0

我同意Marcus Zarra的回答,它通常不是一个值得使用的功能,但想要添加几件事情。我通常会建议添加一个属性来显示您可以排序的显示订单值。

有序集是核心数据中的二等公民,即使对于苹果公司,它们在iCloud核心数据存储中也不被支持(虽然这个系统通常存在问题,我相信它现在已被弃用)。

在Swift中,可以使用值语义编写自己的有序集合,但此时无法启用与基金会有序集合之间的桥接。

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

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