我可以像使用函数那样制作一个重复的类吗

时间:2019-09-02 11:13:23

标签: swift generics duplicates codable

所以我有此代码,我正在尝试为请求创建任务处理程序。但是在某些情况下,请求没有得到响应模型,因此,我不希望它处理任何数据。难以解释,但代码如下所示:

class UserTask<T: Codable>: ExecuteProtocol {

    let userType: UserRequests

    init(userType: UserRequests) {
        self.userType = userType
    }

    var request: URLRequest {
        return userType.build
    }

    public func run(completion: @escaping ((Response<T, NAError>) ->())) {
        executeRequest(request: request) { (response) in
            switch response {
            case .success(let data):
                completion(NADecoder<T>.decode(data: data).model)
                break
            case .failure(let error):
                completion(.failure(error))
                break
            }
        }
    }
}

class UserTask: ExecuteProtocol {

    let userType: UserRequests

    init(userType: UserRequests) {
        self.userType = userType
    }

    var request: URLRequest {
        return userType.build
    }

    public func run(completion: @escaping ((Response<Any?, NAError>) ->())) {
        executeRequest(request: request) { (response) in
            switch response {
            case .success(let data):
                completion(.success(nil))
                break
            case .failure(let error):
                completion(.failure(error))
                break
            }
        }
    }
}

这当然是Invalid redeclaration of 'UserTask',但是我可以用任何流畅的方式做到这一点吗?我尝试过将Codable设为可选,然后将其展开。但是由于我想将其类型保留为“可降解”目的,因此似乎不起作用。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

无需为同一功能创建多个类。您只需要对单个类进行一些更改即可支持您的两个用例。

不是将泛型 <T>添加到class UserTask,而是将其添加到方法run(completion:),即

class UserTask: ExecuteProtocol {
    let userType: UserRequests

    init(userType: UserRequests) {
        self.userType = userType
    }

    var request: URLRequest {
        return userType.build
    }

    public func run<T: Codable>(type: T.Type, completion: @escaping ((Response<T?, NAError>) ->())) {
        //your code here...
    }
}

称呼它,

task.run(type: YourType.self) { (response) in
    //add your code here...
}