【问题标题】:Error: 'Result<Data, FourSquareError>' cannot be constructed because it has no accessible initializers错误:'Result<Data, FourSquareError>' 无法构造,因为它没有可访问的初始化程序
【发布时间】:2020-04-06 11:42:48
【问题描述】:

我正在尝试调用 API,当我将值传递给结果变量时,它给了我一个错误。我在下面的 func mapError 函数上也遇到了这个错误。

知道为什么会出现此错误吗?

提前致谢

'Result[Data, FourSquareError]' 无法构造,因为它没有可访问的初始化程序

'Result[Data, E]' 无法构造,因为它没有可访问的初始化程序

错误出现在以下几行:

let result = Result<Data, FourSquareError>(value: data, error:
          translatedError)

return Result<Value, E>(value)

return Result<Value, E>(try transform (error))

这是完整的代码:

typealias JSON = [String: Any]

enum FourSquareError: Error {
    case couldNotCreateURL
    case networkError(Error)
    case serverError(errorType: String, errorDetail: String)
    case couldNotParseData
}

func createURL(endpoint: String, parameters: [String: String]) -> URL? {
    let baseURL = "https://api.foursquare.com/v2/"

    // We convert the parameters dictionary in an array of URLQueryItems
    var queryItems = parameters.map { pair -> URLQueryItem in
        return URLQueryItem(name: pair.key, value: pair.value)
    }

    // Add default parameters to query
    queryItems.append(URLQueryItem(name: "v", value: apiVersion))
    queryItems.append(URLQueryItem(name: "client_id", value: clientId))
    queryItems.append(URLQueryItem(name: "client_secret", value: clientSecret))

    var components = URLComponents(string: baseURL + endpoint)
    components?.queryItems = queryItems
    return components?.url
}
func getVenues(latitude: Double, longitude: Double, completion: @escaping
     (Result<[JSON], FourSquareError>) -> Void) {
      let parameters = [
          "ll": "\(latitude),\(longitude)",
          "intent": "browse",
          "radius": "250"
      ]

      guard let url = createURL(endpoint: "venues/search", parameters:
     parameters)
          else {
              completion(Result.failure(.couldNotCreateURL))
              return
      }
       let task = URLSession.shared.dataTask(with: url) { data, response,
          error in
               let translatedError = error.map { FourSquareError.networkError($0) }
               let result = Result<Data, FourSquareError>(value: data, error:
          translatedError)
                   // Parsing Data to JSON
                   .flatMap { data in
                       do {
                           return Result.success(try parseData(data))
                       } catch {
                           return Result.failure(.unexpectedError(error))
                       }
                   }
                   // Check for server errors
                   .flatMap { (json: JSON) -> Result<JSON, FourSquareError> in
                       do {
                           return Result.success(try validateResponse(json: json))
                       } catch {
                           return Result.failure(.unexpectedError(error))
                       }
                   }
                   // Extract venues
                   .flatMap { (json: JSON) -> Result<[JSON], FourSquareError> in
                       do {
                           return Result.success(try extractVenues(json: json))
                       } catch {
                           return Result.failure(.unexpectedError(error))
                       }
               }

               completion(result)
           }

           task.resume()
    }
extension Result {
    public func mapError<E: Error>(_ transform: (ErrorType) throws -> E) rethrows -> Result<Value, E> {
        switch self {
        case .success(let value):
            return Result<Value, E>(value)
        case .failure(let error):
            return Result<Value, E>(try transform (error))
        }
    }
}

【问题讨论】:

    标签: ios swift rest swift5


    【解决方案1】:

    Result 是一个枚举,因此您可以构造它。您只能通过以下两种情况之一实例化 Result 实例:failuresuccess。例如:

    let result: Result<Data, FourSquareError> = .success(Data())
    

    let result: Result<Data, FourSquareError> = .failure(FourSquareError.whatever)
    

    【讨论】:

    • 我尝试这样做,然后又遇到另一个错误:Cannot infer contextual base in reference to member 'success' .。成功和失败都是一样的。对此有什么想法吗?
    • 使用此解决方案后,此问题似乎得到解决。 extension Result { init(value: Value?, error: ErrorType?) { if let error = error { self = .failure(error) } else if let value = value { self = .success(value) } else { fatalError("Could not create Result") } } }
    • 很难说没有看到你的代码有什么问题。我发布的解决方案中的代码对我来说编译得很好。
    • @Marcelo 这是一个与原始问题完全不同的问题,但是,您需要在第一个 flatMap 闭包中指定返回类型:.flatMap { data -&gt; Result&lt;JSON, FourSquareError&gt; in
    • 谢谢。我只需要在您提到的第一个 flatMap 中修复此错误。 'Result' 类型的值没有成员 'flatMap'。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多