Объявление вашей функции не означает совсем того, что вы думаете.
private func buildFRC<T:NSManagedObject>(entity: T, sortKey: String) -> NSFetchedResultsController<T>?
Это означает, что T
должен быть подклассом NSManagedObject
, и что первый аргумент должен быть экземпляром T . Когда вы называете это так
self.frc = self.buildFRC(entity: ObjectName, sortKey: "trackName")
... вы передаете подкласс в качестве первого аргумента, когда ваше объявление ожидает экземпляр.
Исправить несложно, потому что вам не нужно включать T
в качестве аргумента. В общем случае, в обобщениях Swift вам не нужно передавать тип в качестве аргумента - тип исходит из того, как используется функция. Отбросьте этот аргумент и перепишите объявление как
private func buildFRC<T:NSManagedObject>(sortKey: String) -> NSFetchedResultsController<T>? {
Затем вызовите функцию с чем-то вроде
self.frc: NSFetchedResultsController<ObjectName>? = self.buildFRC(sortKey: "trackName")
Swift выяснит, что T
представляет ObjectName
в этом вызове, и код будет работать.
На касательной ноте ваш звонок на searchContext.reset()
довольно опасен и, вероятно, не нужен. Если вы извлекаете некоторые объекты из контекста и затем вызываете эту функцию позже, reset
приведет к тому, что все ранее извлеченные объекты станут недействительными. Их использование может привести к сбою вашего приложения.