2016-11-04 11 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

@ウルヴァリンはい。私はswift 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 
    } 
} 

希望は役立ちます。

関連する問題