Я пишу обертку 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 на данный момент мне не понятна. Я прочитал много статей, пытаясь достичь желаемого результата, но не совсем ясно, как мне это сделать. Спасибо за ваши ответы!