2015-02-03 3 views
0

Есть ли способ в Swift взять экземпляр AnyClass и использовать его для объявления массива этого типа?Swift Объявленный типизированный массив из объекта AnyClass

Например, я использую Overcoat и Mantle для сопоставления ответов JSON с моделями, которые сохраняются в CoreData с помощью фреймворков. Прежде чем выполнить запрос get, я вручную выполняю запрос выборки в контексте Core Data и получаю обратно все сохраненные модели. Затем я должен использовать MTLManagedObjectAdapter, который превращает NSManagedObjects в простые модели и обратно, чтобы отобразить результаты запроса на выборку в мои объекты модели.

С этой целью я сделал функцию, что я определил в классе базовой модели:

class func mapResults(results: [NSManagedObject], toModelClass modelClass: AnyClass) -> ([AnyObject], [NSError?]) { 
    var transformed: [AnyObject] = [] 
    var errors: [NSError?] = [] 
    for result in results { 
     var error: NSError? = nil 
     var model: AnyObject! = MTLManagedObjectAdapter.modelOfClass(modelClass, fromManagedObject: result, error: &error) 
     transformed.append(model) 
     errors.append(error) 
    } 
    return (transformed, errors) 
} 

Я хотел бы быть в состоянии объявленной transformedvar transformed: [modelClass] = [], как, но по понятным причинам не работает. Есть ли способ конвертировать этот объект AnyClass в тип или он просто невозможен прямо сейчас в Swift?

ответ

2

В этом случае, вы можете использовать Generics:

class Mapper { 
    class func mapResults<T: AnyObject>(results: [NSManagedObject], toModelClass modelClass: T.Type) -> ([T], [NSError?]) { 

     var transformed: [T] = [] 
     var errors: [NSError?] = [] 

     for result in results { 
      var error: NSError? = nil 
      var model: T = MTLManagedObjectAdapter.modelOfClass(modelClass, fromManagedObject: result, error: &error) as T 
      transformed.append(model) 
      errors.append(error) 
     } 

     return (transformed, errors) 
    } 
} 

Вы можете вызвать этот метод, как:

let (transformed, errors) = Mapper.mapResults(results, toModelClass: MyModel.self) 

Кроме того, в соответствии с MTLManagedObjectAdapter.h,

// modelClass - The MTLModel subclass to return. This class must conform to 
//     <MTLManagedObjectSerializing>. This argument must not be nil. 

Таким образом, вы должны ограничить T как MTLModel и con формы до MTLManagedObjectSerializing:

class func mapResults<T: MTLModel where T: MTLManagedObjectSerializing>(results: [NSManagedObject], toModelClass modelClass: T.Type) -> ([T], [NSError?]) { 
+0

Это фантастика, я совершенно забыл о дженериках. – barndog

Смежные вопросы