我最近在我的程序中发现它,重复没有停止,即使我使用了Set。 该对象称为Category,有两个变量。
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 :(得分:0)
不幸的是,使用Core Data无法实现您的目标 管理对象。
对于NSObject
的子类,您必须覆盖isEqual:
和hash
(而不是==
和hashValue
),请参阅{{ 3}}
对于NSManagedObject
子类,它是明确的&#34;禁止&#34;至
覆盖isEqual:
和hash
,请参阅NSObject subclass in Swift: hash vs hashValue, isEqual vs ==。原因是
您可以比较托管对象的相等性,而无需检索所有它们
来自持久性商店的属性(&#34;触发故障&#34;)。
因此,你无法定义自己的“平等”概念。
对于Core Data托管对象,它使用Set
或。{
NSSet
。
检查集合是否已包含具有给定的托管对象 您可以执行类似
的操作if (combine.contains { $0.name == cate2.name }) {
}
为了避免具有相同名称的Category对象,您将拥有 执行一个获取请求,检查具有给定的对象 名称已存在。