swift一个异步上传方法,它接受一个 逃逸闭包(escaping closure) 作为完成回调
时间: 2025-06-07 16:55:31
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
你给出的函数定义:
func uploadRecording(completion: @escaping (Result) -> Void)
表示一个异步上传方法,它接受一个 逃逸闭包(escaping closure) 作为完成回调,闭包的参数是 Result<String, Error>
类型。
Result
类型解析:
Result
是 Swift 标准库中的一个枚举,用于表示成功或失败的操作:
enum Resultwhere Failure: Error { case success(Success) // 成功时返回 Success 类型的数据 case failure(Failure) // 失败时返回 Error 类型的错误 }
- Success
泛型参数是 String
,表示成功时返回一个字符串。
- Failure
泛型参数是 Error
,表示失败时返回一个错误。
如果你想返回更多数据(如 result: String
+ f: String
或字典):
1️⃣ 返回多个字符串(元组方式)
func uploadRecording(completion: @escaping (Result<(String, String), Error>) -> Void) { // 上传成功后: completion(.success(("resultData", "additionalData"))) // 失败时: completion(.failure(SomeError())) }
调用方式:
uploadRecording { result in switch result { case .success((let resultData, let additionalData)): print("成功: $resultData), $additionalData)") case .failure(let error): print("失败: $error)") } }
2️⃣ 返回字典([String: Any]
)
func uploadRecording(completion: @escaping (Result<[String: Any], Error>) -> Void) { let responseDict = ["result": "data", "f": "value", "otherKey": 123] completion(.success(responseDict)) }
调用方式:
uploadRecording { result in switch result { case .success(let dict): if let resultStr = dict["result"] as? String { print("结果: $resultStr)") } case .failure(let error): print("失败: $error)") } }
3️⃣ 自定义结构体/类(推荐 ✅)
如果返回的数据结构复杂,建议使用 struct
或 class
:
struct UploadResponse { let result: String let f: String let metadata: [String: Any]? }
func uploadRecording(completion: @escaping (Result) -> Void) { let response = UploadResponse(result: "data", f: "value", metadata: nil) completion(.success(response)) }
调用方式:
uploadRecording { result in switch result { case .success(let response): print("成功: $response.result), $response.f)") case .failure(let error): print("失败: $error)") } }
总结:
返回类型 | 示例 | 适用场景 |
---|---|---|
Result<String, Error> | .success("done") | 只返回简单字符串 |
Result<(String, String), Error> | .success(("data1", "data2")) | 返回多个字符串 |
Result<[String: Any], Error> | .success(["key": "value"]) | 返回字典(灵活性高,但类型不安全) |
Result<CustomStruct, Error> | .success(UploadResponse(...)) | 最佳实践,类型安全,可扩展 |
推荐使用 struct
封装数据,而不是字典或元组,因为它更安全、可读性更好。 🚀