2015-02-03 2 views
0

Swift에서 AnyClass의 인스턴스를 가져 와서 해당 유형의 배열을 선언하는 방법이 있습니까?AnyClass 객체에서 Swift Declared Typed Array

예를 들어, OvercoatMantle을 사용하여 JSON 응답을 프레임 워크에서 CoreData에 유지되는 모델로 매핑합니다. 요청 받기 전에 핵심 데이터 컨텍스트에서 수동으로 가져 오기 요청을 수행하고 모든 지속 된 모델을 다시 수신합니다. 그런 다음 MTLManagedObjectAdapter을 사용하여 NSManagedObjects을 일반 모델로 다시 가져와 페치 요청의 결과를 내 모델 개체에 매핑해야합니다. 내가 var transformed: [modelClass] = []으로 만 작동하지 않는 분명한 이유 선언 transformed 수있을 싶어요

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) 
} 

:이를 위해

, 나는 내가 기본 모델 클래스에 정의 된 함수를했다. 해당 AnyClass 개체를 형식으로 변환 할 수있는 방법이 있습니까? 아니면 Swift에서 지금 바로 사용할 수 없습니까?

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. 

그래서 당신은해야한다 :

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) 
    } 
} 

당신은이 방법처럼 호출 할 수 있습니다 :

이 경우

답변

2

, 당신은 Generics 사용할 수 TMTLModel으로 제한하고 양식은 MTLManagedObjectSerializing :

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

까지입니다. 저는 제네릭에 대해 완전히 잊어 버렸습니다. – barndog