2016-11-04 7 views
1

주어진 entityName, predicate 및 sortDescriptors를 사용하여 핵심 데이터 엔티티에서 데이터를 가져 오는 일반적인 방법을 쓰고 있습니다. 결과를 요청 된 엔터티의 배열로 반환하고 싶습니다. 내가 엔티티 이름으로 학생을주는 경우에 아래로, 나는 여기,다른 핵심 데이터 엔티티에서 데이터를 가져 와서 각각의 클래스로 결과를 캐스팅하는 일반 메소드

do { 
     if let results = try CoreDataController.sharedInstance.masterManagedObjectContext.fetch(request) as? [Student] { 

      if results.count > 0 { 

       return results 
      } 
     } 
    } 

학생들의 배열을 반환하는 문제를 필요로 주어진 엔티티 이름을 사용하여 일반적인 방법으로, 각각의 엔티티 클래스의 배열에 결과를 주조하는 방법 ?

let coreDataClass = NSClassFromString(entityName) as! NSManagedObject.Type 

내가 엔티티 이름에서 클래스를 생성하는 것을 시도했다

, 그러나 더 (위 코드에서 장소 학생에) 배열 선언에서 가져온 것입니다. 올바른 방법을 찾도록 도와주세요.

미리 감사드립니다.

+0

Swift3.0을 사용하고 있습니까? – Wolverine

+0

@ 울버린 예. 신속한 3.0 및 Xcode 8.0 사용 –

답변

3

똑같은 시나리오의 경우 Swift Generics를 사용할 수 있습니다.

는 (당신은 클래스 메소드로 coredata 헬퍼 클래스에서이 함수를 정의 할 수 있습니다) 매개 변수로 제공 조건 & 정렬 기술자 객체의 배열을 가져 오는에 대해 다음 스위프트 (버전 3.0.1) 코드를 고려

class func arrayOf<T: NSManagedObject>(_ entity: T.Type, 
             predicate: NSPredicate? = nil, 
             sortDescriptor: [NSSortDescriptor]? = nil, 
             context: NSManagedObjectContext = CoreDataHelper.shared.context()) -> NSMutableArray? { 

    let fetchRequest = NSFetchRequest<T>(entityName: NSStringFromClass(T.self)) 

    if predicate != nil { 
     fetchRequest.predicate = predicate! 
    } 

    if sortDescriptor != nil { 
     fetchRequest.sortDescriptors = sortDescriptor! 
    } 

    fetchRequest.returnsObjectsAsFaults = false 

    do { 

     let searchResult = try context.fetch(fetchRequest) 
     if searchResult.count > 0 { 
      // returns mutable copy of result array 
      return NSMutableArray.init(array: searchResult) 
     } else { 
      // returns nil in case no object found 
      return nil 
     } 

    } catch { 
     print(error.localizedDescription) 
     return nil 
    } 
} 

희망이 도움이됩니다.