Skip to content

使用泛型构建可重用的请求函数

在构建网络请求时,使用泛型可以极大地提高代码的重用性和灵活性。通过泛型,你可以创建一个通用的请求函数,适用于不同类型的请求和响应。

1. 定义泛型请求函数

首先,你需要定义一个泛型函数,该函数接受请求参数并返回响应数据。以下是一个简单的示例:

swift
func performRequest<T: Decodable>(url: URL, completion: @escaping (Result<T, Error>) -> Void) {
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            completion(.failure(error))
            return
        }
        
        guard let data = data else {
            completion(.failure(NSError(domain: "", code: -1, userInfo: nil)))
            return
        }
        
        do {
            let result = try JSONDecoder().decode(T.self, from: data)
            completion(.success(result))
        } catch {
            completion(.failure(error))
        }
    }
    task.resume()
}

2. 使用泛型请求函数

使用这个泛型请求函数非常简单。你只需指定返回的数据类型。例如,假设你有一个用户模型:

swift
struct User: Decodable {
    let id: Int
    let name: String
}

你可以这样调用 performRequest 函数:

swift
if let url = URL(string: "https://api.example.com/user/1") {
    performRequest(url: url) { (result: Result<User, Error>) in
        switch result {
        case .success(let user):
            print("用户ID: \(user.id), 用户名: \(user.name)")
        case .failure(let error):
            print("请求失败: \(error.localizedDescription)")
        }
    }
}

3. 处理不同类型的请求

通过泛型,你可以轻松处理不同类型的请求。例如,如果你有一个产品模型:

swift
struct Product: Decodable {
    let id: Int
    let title: String
}

你可以使用相同的 performRequest 函数来获取产品数据:

swift
if let url = URL(string: "https://api.example.com/product/1") {
    performRequest(url: url) { (result: Result<Product, Error>) in
        switch result {
        case .success(let product):
            print("产品ID: \(product.id), 产品标题: \(product.title)")
        case .failure(let error):
            print("请求失败: \(error.localizedDescription)")
        }
    }
}

4. 优势与总结

使用泛型构建可重用的请求函数有以下优势:

  • 代码简洁:减少重复代码,提高可维护性。
  • 灵活性:可以处理多种数据类型,适应不同的API。
  • 类型安全:编译时检查类型,减少运行时错误。

通过这种方式,你可以轻松构建一个强大且灵活的网络请求层,提升开发效率和代码质量。🚀

本站使用 VitePress 制作