Свифт жалуется на необъявленный тип, но это не проблема - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь получить записи в Базовых данных.

func fetchOrg() {
     var **internalOrganization** = [InternalOrganizationMO]() //NSManagedClass
     let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "InternalOrganization")
     fetchRequest.returnsObjectsAsFaults = false
     do {
          let result = try managedObjectContext.fetch(fetchRequest) as **internalOrganization**  **////Compiler flags Error here**
     } catch {
          fatalError("Failed to fetch internal organization \(error)")
     }
 }

InternalOrganizationMO - это класс ManagedObject, соответствующий объектной модели, и мне кажется, что internalOrganization объявлен какмассив этих объектов, так что помеченная ошибка, кажется, выключена.Насколько я понимаю, это тот тип объекта, который должен быть целью извлечения, но я определенно нахожусь здесь на кривой обучения.

Это то, что извлечение должно быть нацелено на Тип вместо массива - таким образом, жалоба на то, что я не предоставил именованный тип?Если это так, я просто должен предоставить ManagedObject?Если это так, как же я могу определить, сколько записей возвращено?

Действительно ли это лучше, чем просто использовать интерфейс для SQLite?Спасибо, извините за напыщенную речь.

1 Ответ

0 голосов
/ 05 февраля 2019

Вы указываете объекты как типы, а не как объекты.

Пример:

let a = b as! [String]

, а не :

let a = [String]()
let c = b as! a

Решение № 1:

Измените NSFetchRequest<NSFetchRequestResult>, чтобы указать явно тип InternalOrganizationMO, например:

NSFetchRequestResult<InternalOrganizationMO>

Этот fetchRequest теперь имеет соответствующий связанный тип InternalOrganizationMO и будет использоваться соответственно для возврата объектов этого типа.
После этого вам не нужно будет повторно вводить result, и следующий код должен работать нормально:

func fetchOrg() {
    let fetchRequest = NSFetchRequest<InternalOrganizationMO>(entityName: "InternalOrganization")

    do {
        let internalOrganization = try managedContext.fetch(fetchRequest)
        /*
         internalOrganization will be of type [InternalOrganizationMO]
         as that is the return type of the fetch now.
         */

        //handle internalOrganization here (within the do block)

        print(internalOrganization.count)
    }
    catch {
        fatalError("Failed to fetch internal organization \(error)")
    }
}

Решение # 2:

Если вы хотите, чтобы этот метод работал, даже если попытка fetchRequest или приведение типов не удалась, вы можете сделать это:

func fetchOrg() {
    var internalOrganization = [InternalOrganizationMO]()

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "InternalOrganization")

    do {
        internalOrganization = try managedContext.fetch(fetchRequest) as? [InternalOrganizationMO]
        /*
         You ofcourse wouldn't want the above optional binding to fail but even if it
         does, atleast your method can stay consistent and continue with an empty array
         */
    }
    catch {
        fatalError("Failed to fetch internal organization \(error)")
    }

    //handle internalOrganization here
    print(internalOrganization.count)
}

Выбор решения,зависит от вашего дизайна и требований.

...