Как использовать keypath в качестве условия фильтрации для запроса выборки Core Data - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу обертку Core Data. У меня есть структура с именем CoreDataFetcher, построенная на обобщенном c T типа NSManagedObject. Функция fetchAll принимает NSPredicate, что дает мне возможность ввести правильный предикат для фильтрации того, что мне нужно.

struct CoreDataFetcher<T: NSManagedObject>{   

   func fetchAll(where condition: @escaping ()->(NSPredicate), completion: @escaping ([T]?)->()){
      let fetchRequest = NSFetchRequest<T>(entityName: T.entity().managedObjectClassName ?? "")
      let context = CoreDataWrapper.shared.backgroundContext
      context.perform {
         fetchRequest.predicate = condition()
         let results = try? context.fetch(fetchRequest)
         completion(results)
      }
   }
}

Рассмотрим фиктивную модель:

@objc(CatModel)
public class CatModel: NSManagedObject {
    @NSManaged public var name: String
    @NSManaged public var estimated_lifetime: Int16

}

И использование функции, которая на самом деле работает:

 CoreDataFetcher<CatModel>().fetchAll(where: {
    let estimated_lifetimeKeypath = \CatModel.estimated_lifetime
    return estimated_lifetimeKeypath > 20
 }){_ in}

Тем не менее, я хотел бы улучшить синтаксис, чтобы сделать код кратким в полном объеме, поэтому вот что я пытаюсь получить:

CoreDataFetcher<CatModel>().fetchAll(where: { \.estimated_lifetime > 20 }) {_ in}

Как сделать я делаю вывод типа T (CatModel), чтобы просто использовать форму \ .estimated_lifetime? Объект CoreDataFetcher осведомлен о типе T.

В настоящее время я много раз пытался использовать ключевые пути, но, поскольку я их никогда не использовал, эта topi c на данный момент мне не понятна. Я прочитал много статей, пытаясь достичь желаемого результата, но не совсем ясно, как мне это сделать. Спасибо за ваши ответы!

...