2016-12-05 39 views
0

我正在尝试实现一些网络代码,它将在端点获取json,然后将结果解析为CoreData对象。Swift 3 - 使用静态方法的协议,使用泛型类型的实例方法,可选的'.Type'参数

我定义了一个协议JSONParsable,我的一些CoreData对象类符合。

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是有史以来为零,编译器会抱怨有一个错误:

Generic parameter 'T' could not be inferred 

我不知道如何解决这个问题。我想我在某个地方采取了错误的做法,仍然来自Objective-C世界。希望得到一些帮助,如果有必要,还会采取其他方法。

我基本上是说“让json访问特定的URL并使用特定的类扩展来解析它。”

我也想我可以实现'虚拟类'并提供这个?似乎有点肮脏,但不是我们不时有点脏吗? :)

+1

实际上总是有一个*预期类型*,不是吗?那为什么它是可选的呢? – vadian

+0

,因为有时候不需要解析。为了简洁,我没有公开整个API调用。完成块也通过json对象。 – horseshoe7

回答

0

答案不完全是答案,只能说我改变了方法。我创建了一个显式的解析器对象,将协议定义更改为实例方法,并且解析器对象仍然是属于网络客户端的“服务”对象的成员。

它的工作方式很好,因为json解析涉及到提供JSON的端点。

相关问题