我是一名新的iOS开发人员。根据我在android开发方面的经验,我正在尝试编写api类,请求和自动解析json基于类型输入使用HandyJSON库,类似
static func request<T: NSObject>(_ urlRequest: URLRequestConvertible, doOnSuccess: @escaping (T)-> Void, doOnError: @escaping (Error)-> Void) {
Alamofire.request(urlRequest).responseJSON(completionHandler: { response
in
if (T is BaseResponse) { // This is Invalid Swift code
// I am using HandyJSON Library to parse to T
if let jsonObject = (T as! BaseResponse).deserialize(from: response.result.value as? NSDictionary) {
doOnSuccess(jsonObject)
}
}
else {
doOnError(NSError.init(domain: APIRouter.DOMAIN, code: APIRouter.ERROR_INTERNAL_ERROR, userInfo: nil))
}
}
})
}
此代码中的部分在Swift中无效,我无法搜索任何解决方案。
如果您对我的api请求功能有任何建议,也欢迎。我很惊讶在我的项目中,他们不解析json和基于key的访问值,也使用像HandyJSON这样的json解析器库不受欢迎。
答案 0 :(得分:1)
如果你想创建可以返回BaseResponse
和Array< BaseResponse >
的Generic方法,那么你应该创建两个方法,如:
static func request<T: BaseResponse>(_ urlRequest: URLRequestConvertible, doOnSuccess: @escaping (T)-> Void, doOnError: @escaping (Error)-> Void) {
Alamofire.request(urlRequest).responseJSON(completionHandler: { response
in
if let jsonObject = T.deserialize(from: response.result.value as? NSDictionary) {
doOnSuccess(jsonObject)
} else {
doOnError(NSError.init(domain: APIRouter.DOMAIN, code: APIRouter.ERROR_INTERNAL_ERROR, userInfo: nil))
}
})
}
static func request<T: BaseResponse>(_ urlRequest: URLRequestConvertible, doOnSuccess: @escaping ([T])-> Void, doOnError: @escaping (Error)-> Void) {
Alamofire.request(urlRequest).responseJSON(completionHandler: { response
in
if let jsonObject = [T].deserialize(from: response.result.value as? NSDictionary) {
doOnSuccess(jsonObject)
} else {
doOnError(NSError.init(domain: APIRouter.DOMAIN, code: APIRouter.ERROR_INTERNAL_ERROR, userInfo: nil))
}
})
}
您还可以将Alamofire
代码移动到其他方法并从中返回Dictionary
并使用各种方法进行解析。