Как разыграть T.Type для NSFetchRequest? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть подпись метода: func fetch<T>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) where T: Storable, и я хотел бы использовать model в NSFetchRequest.

В этой ситуации используется extension NSManagedObject: Storable {}, а протокол Storable имеет некоторыеосновные определения метода CRUD внутри.

Я пробовал:

  • приведение T к NSManagedObject, однако это вызвало ошибки приоритета операторов.(T as! NSManagedObject) не сработало, поэтому.

  • только с использованием NSFetchRequest<T>(), но компилятор сообщает мне, что T does not conform to NSFetchRequestResult.

  • where T: Storable, NSManagedObject, но это означало бы необходимость обновления моего протокола, чтобы иметь подробности реализации, и я не хочу туда идти.

  • (model as! NSManagedObject).fetchRequest(), но Cast from 'T.Type' to unrelated type 'NSManagedObject' always fails

То, что я пытаюсь достичь, в основном: я хочу иметь возможность fetch(User.self, ...) с текущей сигнатурой метода, если это возможно.

1 Ответ

0 голосов
/ 10 апреля 2019

Ответ состоит в том, чтобы привести T.Type к NSManagedObject.Type, чтобы получить тип, а затем вызвать .fetchRequest() для этого.

func fetch<T: Storable>(_ model: T.Type, predicate: NSPredicate?, sorted: Sorted?, completion: (([T]) -> Void)) {
    guard let managedObjectType = model as? NSManagedObject.Type else {
        return
    }

    let fetchRequest = managedObjectType.fetchRequest()
    fetchRequest.predicate = predicate
    ...
}
...