2016-12-05 3 views
0

Ich versuche, einige Netzwerk-Code zu implementieren, der Json an einem Endpunkt erhält, dann das Ergebnis in CoreData-Objekte analysieren.Swift 3 - Protokoll mit statischen Methoden, Instanzmethode mit generischen Typen, optional '.Type' -Parameter

Ich habe ein Protokoll JSONParsable definiert, dem einige meiner CoreData-Objektklassen entsprechen.

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? 

} 

Warum? Weil sie Hilfsmethoden für Objekte dieses Typs sind. So ist die "GET-Objekte" Methode auf meinem Netzwerk-Client "Manager" sieht grundsätzlich wie folgt:

private func get<T:JSONParsable>(_ urlString: URLConvertible, expectedObjectType:T.Type?, completion: @escaping (_ success: Bool) -> Void) 

Das Problem ist, wenn expectedObjectType immer null ist, beschwert sich der Compiler mit einem Fehler:

Generic parameter 'T' could not be inferred 

Ich bin mir nicht sicher, wie ich das lösen soll. Ich nehme an, ich habe irgendwo einen falschen Ansatz gewählt und bin immer noch aus der Objective-C-Welt. Würde einige Hilfe, einschließlich eines anderen Ansatzes, wenn nötig, schätzen.

Ich bin im Grunde sagen "Get Json bei einer bestimmten URL und verwenden Sie eine bestimmte Klassenerweiterung, um es zu analysieren."

Ich denke auch, ich könnte eine 'Dummy-Klasse' implementieren und das zur Verfügung stellen? Scheint ein bisschen dreckig, aber sind wir nicht alle ein bisschen schmutzig von Zeit zu Zeit? :)

+1

Praktisch gibt es immer einen * erwarteten Typ *, nicht wahr? Warum ist es überhaupt optional? – vadian

+0

weil manchmal kein Parsing benötigt wird. Ich habe den gesamten API-Aufruf der Kürze halber nicht dargelegt. Der Komplettierungsblock durchläuft auch das Json-Objekt. – horseshoe7

Antwort

0

Die Antwort ist nicht genau eine Antwort, nur um zu sagen, dass ich den Ansatz geändert habe. Ich habe ein explizites Parser-Objekt erstellt, die Protokolldefinition in Instanzmethoden geändert, und das Parser-Objekt bleibt Mitglied eines "Service" -Objekts, das zum Netzwerk-Client gehört.

Es funktioniert gut auf diese Weise, weil JSON Parsing auf den Endpunkt bezieht, der JSON bereitstellt.

Verwandte Themen