相关问题:Swift中的通用完成处理程序
在我写的Swift应用程序中,我正在下载JSON,我想将其转换为模型对象.现在,我这样做:
func convertJSONData<T: Entity>(jsonData: NSData?, jsonKey: JSONKey, _: T.Type) -> [T]? {
var entities = [T]()
if let data = jsonData {
// Left out error checking for brevity
var json = JSON(data: data, options: nil, error: nil)
var entitiesJSON = json[jsonKey.rawValue]
for (index: String, subJson: JSON) in entitiesJSON {
// Error: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
let entity = T(json: subJson)
entities.append(entity)
}
}
return entities
}
Run Code Online (Sandbox Code Playgroud)
每个对象符合Entity工具init(json: JSON).JSON是SwiftyJSON库中定义的类型.这也是枚举看起来有点奇怪的原因.
我打电话给convertJSONData()这个方法:
public …Run Code Online (Sandbox Code Playgroud) 我有一个方法,有一个名为的方法performRequest().它需要一个JSONRequest参数.JSONRequest看起来像这样:
public typealias JSONCompletionHandler = ([Entity]?, NSError?) -> Void
public class JSONRequest: Request {
public var completionHandler: JSONCompletionHandler
public var endPoint: String
}
Run Code Online (Sandbox Code Playgroud)
而且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)
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它调用convertJSONData()如下所示:
func convertJSONData<T where T: Entity>(jsonData: AnyObject, _: T.Type) …Run Code Online (Sandbox Code Playgroud)