Swift报错:Type '(any Error)?' has no member 'success' 求助
问题原因
你在ViewModel里调用webService.createGroup时,错误地将闭包参数result当作Result类型,用switch匹配.success/.failure分支,但实际上WebService的createGroup方法的completion参数是Error?——成功时传入nil,失败时传入Error实例。Error?类型并没有.success和.failure成员,这就是报错的核心原因。
解决方案
提供两种可行的修复方式,推荐使用方案一(符合Swift异步处理的标准范式):
方案一:修改WebService的createGroup方法,返回Result类型
调整方法的completion类型为Result<Data, NetworkError>,让成功/失败的语义更清晰,同时保留错误信息的传递:
1. 完善WebService的错误枚举(如果未定义完整)
extension WebService { enum NetworkError: Error { case invalidResponse case requestFailed(Error) case invalidStatusCode(Int) } }
2. 修改createGroup方法实现
func createGroup(url: URL, requestBody: [String: Any], completion: @escaping (Result<Data, WebService.NetworkError>) -> Void) { var request = URLRequest(url: url) request.httpMethod = "POST" request.httpBody = try? JSONSerialization.data(withJSONObject: requestBody) request.addValue("application/json", forHTTPHeaderField: "Content-Type") let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error creating group: \(error)") completion(.failure(.requestFailed(error))) return } guard let httpResponse = response as? HTTPURLResponse else { print("Error: No HTTP response") completion(.failure(.invalidResponse)) return } print("HTTP Response Status Code: \(httpResponse.statusCode)") guard (200...299).contains(httpResponse.statusCode) else { print("Error: Unexpected HTTP response status code") if let data = data { let responseString = String(data: data, encoding: .utf8) ?? "Unable to convert data to string" print("HTTP Response Data: \(responseString)") } completion(.failure(.invalidStatusCode(httpResponse.statusCode))) return } guard let responseData = data else { print("Error: No response data") completion(.failure(.invalidResponse)) return } completion(.success(responseData)) } task.resume() }
3. 调整ViewModel中的调用逻辑
此时可以正常使用switch匹配Result的成功/失败分支:
webService.createGroup(url: apiUrl, requestBody: requestBody) { result in switch result { case .success(let responseData): // 可根据需求解析responseData为对应模型 print("Group created successfully, response data: \(responseData)") completion(.success("Group created successfully")) case .failure(let error): print("Error creating group:", error) // 若上层completion为Result类型,可传递错误:completion(.failure(error)) return } }
方案二:不修改WebService,适配现有Error?参数
如果不想改动WebService的实现,直接根据Error?的特性调整ViewModel的调用逻辑:
webService.createGroup(url: apiUrl, requestBody: requestBody) { error in if let error = error { print("Error creating group:", error) // 若上层有错误回调,可在此传递 // completion(.failure(error)) return } // 无error即为请求成功 print("Group created successfully") completion(.success("Group created successfully")) }
内容的提问来源于stack exchange,提问作者AppleDev3
相关产品推荐
相关产品推荐

