在Swift中使用泛型类型并强制转换为其他类类型

时间:2018-02-01 03:08:28

标签: swift

我是一名新的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解析器库不受欢迎。

1 个答案:

答案 0 :(得分:1)

如果你想创建可以返回BaseResponseArray< 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并使用各种方法进行解析。