如何使用从核心数据创建的NSSet

时间:2018-11-22 20:52:55

标签: swift core-data nsset

我有以下核心数据模型: enter image description here enter image description here

“人与代码”是一对多关系。

我有一个返回Person记录的函数,如果代码person.codes返回与该Person关联的所有代码的NSSet。我遇到的问题是如何使用NSSet。

person.codes.allObjects.first返回以下数据:

<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元素,但是会出现错误:{{1} }

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

我很欣赏这可能是一个简单的问题,但是已经搜索并阅读了文档,无济于事。我怀疑基础知识可能不足。

更新

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

error: value of type 'Any?' has no member 'number'

我可以使用以下方法来获取一个人

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
        }
    }

2 个答案:

答案 0 :(得分:1)

Core Data支持广泛的本机Swift类型。

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

它比 typeless NSSet方便得多。
您将获得一个强类型,并且无需进行类型转换即可应用filtersort等所有本机函数。

答案 1 :(得分:0)

let codes = person.codes as! Set<Code>

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

let filteredCodes = codes.filter({ $0.code == "XYZ" })

将返回所有具有代码“ XYZ”的对象。或仅获得一个即可使用

let code = codes.first(where: {$0.id == 1})

将返回第一个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: { $0.code == code }) {
            result.append(person)
        }
    }

    return persons
}