如何使用从 Core Data 创建的 NSSet

How to use NSSet created from Core Data

我有以下核心数据模型:

Person to Codes 是一对多的关系。

我有一个函数,其中 returns 一个人记录,如果代码 person.codes returns 一个与该人相关的所有代码的 NSSet。我遇到的问题是如何使用 NSSet。

person.codes.allObjects.firstreturns这个数据:

<Codes: 0x60000213cb40> (entity: Codes; id: 0xb978dbf34ddb849 <x-coredata://A2B634E4-E136-48E1-B2C5-82B6B68FBE44/Codes/p1> ; data: {
    code = 4LQ;
    number = 1;
    whosAccount = "0xb978dbf34ddb869 <x-coredata://A2B634E4-E136-48E1-B2C5-82B6B68FBE44/Person/p1>";
})

我想如果我将 person.codes.allObjects.first 设为 Codes 类型,我将能够访问 codenumber 元素,但我收到错误消息:error: value of type 'Any?' has no member 'number'

此外,如何在该数据集中搜索特定代码或数字。

我明白这可能是一个简单的问题,但搜索并阅读文档无济于事。我怀疑可能基础知识不够。

更新

我有一个 CoreDataHandler class,其中包含以下代码:

class CoreDataHandler: NSObject {
    //static let sharedInstance = CoreDataHandler()

    private static func getContext() -> NSManagedObjectContext {
        let appDelegate = NSApplication.shared.delegate as! AppDelegate

        return appDelegate.persistentContainer.viewContext
    }

    static func fetchPerson() -> [Person]? {
        let context = getContext()

        do {
            let persons: [Person] = try context.fetch(Person.fetchRequest())
            return persons
        } catch {
            return nil
        }
    }

我可以使用以下方法找人:

let row = personTableView.selectedRow
let person = CoreDataHandler.fetchPerson()?[row]
let codes = person.codes as! Set<Code>

完成后,您可以访问属性。搜索可以通过过滤来完成,例如

let filteredCodes = codes.filter({ [=11=].code == "XYZ" })

将 return 所有具有代码 "XYZ" 的对象。或者只得到一个你可以使用

let code = codes.first(where: {[=12=].id == 1})

这将 return 第一个 id = 1 的对象

获取所有具有给定代码的 Person 对象的简单示例

func findWithCode(_ code: String) -> [Person] {
    guard let persons = CoreDataHandler.fetchPerson() else {
        return []
    }

    var result = [Person]()
    for person in persons {
        let codes = person.codes as! Set<Code>
        if codes.contains(where: { [=13=].code == code }) {
            result.append(person)
        }
    }

    return persons
}

Core Data 支持广泛的原生 Swift 类型。

Person class 中将 codes 声明为 Set<Codes>

无类型 NSSet.
方便多了 你得到一个强类型,你可以应用所有原生函数,如 filtersort 等,而无需类型转换。