设置不适用于NSManagedObject?

时间:2016-02-21 21:17:00

标签: ios swift core-data set nsset

我最近在我的程序中发现它,重复没有停止,即使我使用了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)

它会在最后一行代码中失败。 任何知道原因的人能给我一些建议吗?

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对象,您将拥有 执行一个获取请求,检查具有给定的对象 名称已存在。