Как использовать NSSet, созданный из Core Data - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующая базовая модель данных: enter image description here enter image description here

, где отношение «человек-код» - это отношение «один ко многим».

У меня есть функция, которая возвращает запись Person, и если код person.codes возвращает NSSet всех кодов, связанных с этим Person.Вопрос, который у меня возник, заключается в том, как использовать 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, ябудет иметь доступ к элементам code и number, но я получаю сообщение об ошибке: error: value of type 'Any?' has no member 'number'

Кроме того, как я могу найти этот набор данных для определенного кода или номера.

Я понимаю, что это, вероятно, простой вопрос, но я искал и читал документацию безрезультатно.Я подозреваю, что базовых знаний недостаточно.

Обновление

У меня есть класс CoreDataHandler, который содержит следующий код:

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]

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Базовые данные поддерживают широко собственные типы Swift.

Объявите codes как Set<Codes> в классе Person.

Это гораздо удобнее, чем без ввода NSSet.
Вы получаете сильный тип и можете применять все нативные функции, такие как filter, sort и т. Д. Без типаотбрасывать.

0 голосов
/ 23 ноября 2018
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
}
...