我有一个方法,它有一个名为performRequest()
的方法。 它需要一个JSONRequest
参数。 JSONRequest
大概长这样:
public typealias JSONCompletionHandler = ([Entity]?, NSError?) -> Void
public class JSONRequest: Request {
public var completionHandler: JSONCompletionHandler
public var endPoint: String
}
而 performRequest()
代码如下:
public func performJSONRequest<T where T: Entity>(jsonRequest: JSONRequest, _: Type) {
// Make a request which returns a data object
var entities = self.convertJSONData(data, jsonKey: jsonRequest.jsonKey, T.self)
// Error: 'T' is not identical to 'Entity'
jsonRequest.completionHandler(entities, error)
}
正如你所看到的,它调用了convertJSONData()
函数,其代码如下:
func convertJSONData<T where T: Entity>(jsonData: AnyObject, _: T.Type) -> [T] {
// Convert the data into Swift collection classes, enumerate over them, and create model objects
var json = JSON(data: jsonData as NSData, options: nil, error: nil)
var entities = [T]()
for obj in json {
let book = T(json: obj)
entities.append(book)
}
return entities
Entity
是一个协议,我所有的模型类(例如 Author
和 Book
)都要遵守这个协议。
它定义了一个方法:init(json: JSON)
。因为 T
被定义为 T:Entity
,我可以调用 T:(json: obj)
来创建任何符合 Entity
协议的类的实例。
我希望能够使用 performJSONRequest()
方法来请求符合 Entity
协议的任何对象。例如,我想像这样构建一个针对书籍实例的请求:
var request = JSONRequest(endPoint: "books") { (let object: [Entity]?, let error: NSError?) -> Void in
// Cast object to [Book] and have fun
}
performJSONRequest<Book>(request)
我真的想不出如何实现这个。目前,我在performJSONRequest()
方法中得到一个错误,提示'T'与'Entity'不相同
。如果我在完成处理程序中将数组定义为[AnyObject]
,我会得到相同的错误:'T'与'AnyObject'不相同
。
感谢任何帮助!
JSONRequest
内定义JSONCompletionHandler
会允许它使用其T
类型占位符。非常感谢您的完整答案! - wander