使用泛型构建可重用的请求函数
在构建网络请求时,使用泛型可以极大地提高代码的重用性和灵活性。通过泛型,你可以创建一个通用的请求函数,适用于不同类型的请求和响应。
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。
- 类型安全:编译时检查类型,减少运行时错误。
通过这种方式,你可以轻松构建一个强大且灵活的网络请求层,提升开发效率和代码质量。🚀