You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:03:22