2016-04-25 317 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中,可以使用值語義編寫自己的有序集合,但此時無法啓用與基金會有序集合之間的橋接。

如果您真的非常渴望支持它,您可以編寫自定義代碼生成器來爲您的自定義有序集類型創建訪問器(或者只需手動添加訪問器)。

總之有些方法可以做到,但這並不意味着你應該做到。