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? :)
Praktisch gibt es immer einen * erwarteten Typ *, nicht wahr? Warum ist es überhaupt optional? – vadian
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