2017-12-06 8 views
0
func fetchRequestFromViewContext(nameOfEntity: NSManagedObject) { 
    let fetchRequest = NSFetchRequest<nameOfEntity>(entityName: "\(nameOfEntity)") 
    do { 
     let result = try? CoreDataStack.instance.viewContext.fetch(fetchRequest) 

    } 
} 

コアデータフェッチ要求を抽象化しようとしているため、タイプ管理オブジェクトの引数を作成し、フェッチ要求に渡しますが、それを抽象化しようとしていませんコアデータフェッチ要求?コアデータフェッチ要求の抽象化

+0

ようこそスタックオーバーフローに:

func fetchRequestFromViewContext<T: NSManagedObject>(nameOfEntity: String, type: T.Type) { let fetchRequest = NSFetchRequest<T>(entityName: nameOfEntity) do { let result = try? CoreDataStack.instance.viewContext.fetch(fetchRequest) } } 

は、あなたは、単にだろうこれを呼び出します。 _しかし、ドームの詳細を追加してくださいme_をさせていません。エラーメッセージが表示されますか?それをどうやって使いますか? – pirho

+0

NSFetchRequestはすでに一般的です。 'Entity.fetch(述語:NSPredicate)'のようなものを書くことができ、適切なサブクラス型を返すことができるように、クラスメソッドでプロトコル拡張を追加することによって抽象性を劇的に向上させることができます。 – vadian

答えて

0

NSFetchRequest(entityName:)は、Stringであるが、nameofEntityとなるが、NSManagedObjectとした。これをStringに変更し、エンティティのタイプも渡します。ジェネリック(<T>以下)を使用して、NSManagedObjectに準拠する任意のクラスを許可することができます。

fetchRequestFromViewContext(nameOfEntity: "YourEntity", type: YourEntity.self) 
+0

管理対象のオブジェクトコンテキストを抽象化することもできますか? – Jagermeiste

+0

@Jagermeisteはい、 'DataManager(context:NSManagedObjectContext)'のように、イニシャライザで管理対象オブジェクトのコンテキストをとるクラスを作成できます。それからあなたがそれを呼び出すとき、あなたは使いたい文脈で合格します。 – Paolo