2011-08-17 48 views
2

兩個相關的問題:把從NSArray的項目的NSSet爲NSManagedObject

  1. 當您使用[NSSet setWithArray:],它會自動刪除重複的對象嗎?

  2. 你怎麼能告訴究竟你想要「重複」的意思?即如果您有一堆「大學課程」對象,每個對象都有一個名稱和部分編號,並且您希望轉移到NSSet,爲每個特定名稱保留一個大學課程(例如,如果您有三部分微積分,你如何告訴它只保留一段微積分,即使它們的分段號不同,所以它們在默認情況下不會被認爲是相同的)。

謝謝!讓我知道,如果這個問題根本不清楚。我很難找出一種方式來表達它。

編輯:這個問題是特定於NSManagedObjects,它的isEqual:方法不能被覆蓋。

回答

7
  1. documentation

    如果相同的對象出現比在陣列一次,它被添加 僅一次返回集。

  2. 平等在此確定在整個可可與-isEqual:方法(以及-hash方法)。如果您希望兩個自定義對象被視爲相同,則應該適當地覆蓋這些對象,並且必須重寫這兩個對象。這些通常用於使真正相同且通常可以互換的對象(但是是單獨的對象)可以被看作是這樣的。在你的例子中,聽起來大學課程對象確實是「不同的」(即它們代表不同的類別,即使它們可能共享相同的整體「微積分」主題),所以將這些對象實例稱爲「相等」似乎有問題如果這是一個大型的項目/代碼庫。在你的情況下,你可能會考慮將對象逐個添加到集合中,並在添加時進行自己的比較,以確保獲得每個「主題」中的一個。

+0

對不起,這是一個糟糕的例子,這正是我從頭頂上想出來的。我可以重寫isEqual,並將查看'hash'函數。以前沒有聽說過。 (顯然是iOS的新手)。 – Mason

+2

@梅森:很酷。覆蓋時,通過使用任何內部數據的哈希值來傳遞平等差別通常很容易,例如字符串的哈希值與課程名稱。散列*需要*對於「相等」對象是相同的,但它不必是唯一的。 –

+0

呃哦,增加了複雜性。我使用的對象是NSManagedObjects,因此覆蓋'isEqual:'是非法的。我想這會改變這個問題。有小費嗎? – Mason

相關問題