エンドポイントでjsonを取得し、その結果をCoreDataオブジェクトに解析するネットワークコードを実装しようとしています。Swift 3 - 静的メソッドを持つプロトコル、ジェネリック型のインスタンスメソッド、オプションの '.Type'パラメータ
CoreDataオブジェクトクラスのいくつかが準拠しているプロトコルJSONParsableを定義しました。
import SwiftyJSON
import CoreData
protocol JSONParsable {
// you validate the json response from the server to make sure it has everything you expect to function properly
static func validate(_ jsonResponse: JSON) throws
// now parse the jsonResponse
static func parseAll<T: NSManagedObject>(_ jsonResponse:JSON, into context:NSManagedObjectContext) -> [T]!
// describes how to parse one data object in a json response
static func parse<T: NSManagedObject>(_ jsonObject:JSON, into context:NSManagedObjectContext) -> T?
}
なぜですか?それらはその型のオブジェクトのためのユーティリティメソッドですから。だから私のネットワーキングクライアント「マネージャー」の「GETオブジェクト」方法は次のように基本的になります。
private func get<T:JSONParsable>(_ urlString: URLConvertible, expectedObjectType:T.Type?, completion: @escaping (_ success: Bool) -> Void)
問題はexpectedObjectTypeがこれまでにnilの場合、コンパイラはエラーで文句を言い、次のとおりです。
Generic parameter 'T' could not be inferred
私はこれを解決する方法がわかりません。私はどこかに間違ったアプローチをとって、Objective-Cの世界からまだ離れていると思います。必要に応じて異なるアプローチを含むいくつかの助けに感謝します。
私は基本的に「特定のURLでjsonを取得し、それを解析するために特定のクラス拡張を使用します」と言っています。
私は「ダミークラス」を実装してそれを提供できるとも考えていますか?ちょっと汚れているようですが、時々私たちは少し汚れていませんか? :)
実際には常に*予想されるタイプ*がありますか?それでは、なぜそれはオプションですか? – vadian
が必要になることがあります。私は簡潔さのためにAPI呼び出し全体を公開していません。完了ブロックは、jsonオブジェクトも通過します。 – horseshoe7