Swift 3 - 使用静态方法的协议,具有泛型类型的实例方法,可选' .Type'参数

时间:2016-12-05 10:43:16

标签: ios swift generics

我尝试实现一些网络代码,这些代码将在端点上获取json,然后将结果解析为CoreData对象。

我定义了一些协议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?

}

为什么呢?因为它们是该类型对象的实用方法。所以&#34; GET Objects&#34;在我的网络客户端&#34;经理&#34;看起来基本上是这样的:

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世界。非常感谢一些帮助,包括必要的不同方法。

我基本上说&#34;在特定的URL上获取json并使用特定的类扩展来解析它。&#34;

我还以为我可以实施一个“虚拟班级”课程。并提供?看起来有点脏,但我们不时都有点脏吗? :)

1 个答案:

答案 0 :(得分:0)

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

这种方式效果很好,因为json解析与提供JSON的端点有关。

相关问题