Приведение к обобщенному типу класса c в swift - PullRequest
1 голос
/ 11 апреля 2020

Моя цель - вернуть полученные результаты из БД в любой заданный тип (модель). По какой-то причине я получаю сообщение об ошибке «Использование необъявленного типа« модель »». Что мне здесь не хватает? и как достичь своей цели.

func fetchData<T>(entity:String, model: T)-> T? {


    let request = NSFetchRequest<NSFetchRequestResult>(entityName:entity)
    request.returnsObjectsAsFaults = false

        do {

            let result = try managedObjectContext.fetch(request)
            if result.count > 0 {

                return result as model // Point that gets the error 

            }

        } catch {

          print("Failed to retrive data")
        }

    return nil

}

Ответы [ 2 ]

2 голосов
/ 11 апреля 2020

Нет необходимости приводить.

Основываясь на ответе Йоакима, я рекомендую сделать метод более обобщенным c, а также throw для передачи ошибки вызывающей стороне.

Создание запроса на выборку с типом generi c избавляет от приведения типа

func fetchData<T : NSFetchRequestResult>(entity:String, model: T.Type) throws -> [T] {
    let request = NSFetchRequest<T>(entityName:entity)
    request.returnsObjectsAsFaults = false
    return try managedObjectContext.fetch(request)
}

и использует его

do {
    let result = try fetchData(entity: “Foo”, model: Foo.self) 
    print(result)
} catch {
    print("Failed to retrive data")
}
2 голосов
/ 11 апреля 2020

Вы хотите использовать as, а не is при приведении, и тип для приведения - T, а не model, или, скорее, это [T], поскольку это массив, поэтому для объявления функции необходимо быть также модифицированным

func fetchDsata<T>(entity:String, model: T.Type)-> [T]? {
    let request = NSFetchRequest<NSFetchRequestResult>(entityName:entity)
    request.returnsObjectsAsFaults = false
        do {
            let result = try managedObjectContext.fetch(request)
            if result.count > 0 {
                return result as? [T]
            }
        } catch {
          print("Failed to retrive data")
        }
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...