It looks like work for ...

Type Erasure!
Swift , . , , NSFetchedResultsController . , Swift ( ) , . , . AnyFetchedResultsController (a NSFetchedResultsController<T> where T: ManagedObjectDisplayType), .
class AnyFetchedResultsController: CustomDebugStringConvertible
{
var descImpl: () -> String
var performImpl: () throws -> ()
init<T>(_ controller: NSFetchedResultsController<T>) where T: ManagedObjectDisplayType {
descImpl = { controller.debugDescription }
performImpl = { try controller.performFetch() }
}
func performFetch() throws {
try performImpl()
}
var debugDescription: String {
return "wrapping \(descImpl())"
}
}
let entity1Request = NSFetchRequest<Entity1>(entityName: "Foobar")
let entity1Frc = NSFetchedResultsController<Entity1>(fetchRequest: entity1Request, managedObjectContext:mainManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
let entity2Request = NSFetchRequest<Entity2>(entityName: "Barfoo")
let entity2Frc = NSFetchedResultsController<Entity2>(fetchRequest: entity2Request, managedObjectContext:mainManagedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
let frcs: [AnyFetchedResultsController] = [AnyFetchedResultsController(entity1Frc), AnyFetchedResultsController(entity2Frc)]
, , AnyFetchedResultsController , NSFetchedResultsController.
, . , , !
AnyFetchedResultsController.init:
init<T, U: NSFetchedResultsController<T>>(_ controller: U, _ managedObjectType: T? = nil) where T: ManagedObjectDisplayType
dummy managedObjectType, , , . , :
init<T>(_ controller: NSFetchedResultsController<T>) where T: ManagedObjectDisplayType
( ), , .