2016-02-21 10 views
0

我最近在我的程序中發現它,重複不停止,即使我使用Set。 該對象稱爲Category,具有兩個變量。Set不適用於NSManagedObject?

import Foundation 
import CoreData 

extension Category { 
    @NSManaged var name: String? 
    @NSManaged var items: NSSet? 
} 
class Category: NSManagedObject { 
    override var hashValue: Int { 
    return name!.hashValue 
    } 
} 
func == (left: Category, right: Category) -> Bool { 
    return left.name == right.name 
} 

我重寫了hashValue:Int和類中的==方法,但Set仍然將它們視爲兩個對象。這是否意味着Set不適用於NSManagedObjects,或者我還有什麼需要完成的?

這裏是我的單元測試代碼:

guard let cate1 = NSEntityDescription.insertNewObjectForEntityForName("Category", inManagedObjectContext: context) as? MyProgram.Category else { return } 
    cate1.name = "Cate" 
    cate1.items = nil 
    guard let cate2 = NSEntityDescription.insertNewObjectForEntityForName("Category", inManagedObjectContext: context) as? MyProgram.Category else { return } 
    cate2.name = "Cate" 
    cate2.items = nil 
    let combine = Set<MyProgram.Category>([cate1, cate2]) 
    assert(cate1.hashValue == cate2.hashValue) 
    assert(combine.count == 1) 

它會在最後一行代碼失敗。 任何知道原因的人都能給我一些建議嗎?

回答

0

不幸的是,你所要做的是不可能與Core Data 管理對象。

至於核心數據的方式,它與SetNSSet管理的對象,你不能定義自己的「平等」 的概念的結果。

要檢查組已經包含與特定 物業管理對象,你可以這樣做

if (combine.contains { $0.name == cate2.name }) { 

} 

爲了避免名稱相同類別的對象,你就必須 執行取請求,該請求檢查具有給定的 名稱的對象是否已經存在。

+0

非常感謝,它有幫助! –

相關問題