2016-12-05 7 views
0

エンドポイントで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を取得し、それを解析するために特定のクラス拡張を使用します」と言っています。

私は「ダミークラス」を実装してそれを提供できるとも考えていますか?ちょっと汚れているようですが、時々私たちは少し汚れていませんか? :)

+1

実際には常に*予想されるタイプ*がありますか?それでは、なぜそれはオプションですか? – vadian

+0

が必要になることがあります。私は簡潔さのためにAPI呼び出し全体を公開していません。完了ブロックは、jsonオブジェクトも通過します。 – horseshoe7

答えて

0

答えはまさに答えではなく、私がアプローチを変更したと言うだけです。明示的なパーサーオブジェクトを作成し、プロトコル定義をインスタンスメソッドに変更しました。パーサーオブジェクトは、ネットワーククライアントに属する 'サービス'オブジェクトのメンバーのままです。

JSON解析はJSONを提供するエンドポイントに関連しているため、この方法でうまく動作します。

関連する問題