【问题标题】:Set doesn't work for NSManagedObject?Set 不适用于 NSManagedObject?
【发布时间】:2016-02-21 21:17:00
【问题描述】:

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

它会在最后一行代码失败。 哪位知道原因的可以给我一些建议吗?

【问题讨论】:

    标签: ios swift core-data set nsset


    【解决方案1】:

    不幸的是,Core Data 无法实现您想要做的事情 托管对象。

    因此,您无法定义自己的“平等”概念 以与 SetNSSet.

    检查一个集合是否已经包含一个给定的托管对象 属性,你可以做类似的事情

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

    为了避免使用相同名称的 Category 对象,您可以 执行一个 fetch 请求,检查是否有给定的对象 名称已存在。

    【讨论】:

    • 非常感谢,它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2012-02-26
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多