I have a method which has a method named performRequest()
. It takes a JSONRequest
parameter. JSONRequest
looks something like this:
public typealias JSONCompletionHandler = ([Entity]?, NSError?) -> Void
public class JSONRequest: Request {
public var completionHandler: JSONCompletionHandler
public var endPoint: String
}
And performRequest()
looks like this:
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)
}
As you can see, it calls convertJSONData()
which looks like this:
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 is a protocol which all my model classes, for example Author
and Book
, conform to.
It defines one method: init(json: JSON)
. Since T
is defined as T:Entity
, I can just call T:(json: obj)
to create instances of any class conforming to Entity
.
I want to be able to use performJSONRequest()
to perform request for any object conforming to Entity. For example, I want to build a request for Book instances like this:
var request = JSONRequest(endPoint: "books") { (let object: [Entity]?, let error: NSError?) -> Void in
// Cast object to [Book] and have fun
}
performJSONRequest<Book>(request)
I can't for the life of me find out how I would implement this. Right now, I get an error in the performJSONRequest()
method saying 'T' is not identical to 'Entity'
. If I define the array in the completion handler as [AnyObject]
I get the same error: 'T' is not identical to 'AnyObject'
.
Thanks for any help!