繁体   English   中英

错误:'结果<data, foursquareerror> ' 无法构造,因为它没有可访问的初始值设定项</data,>

[英]Error: 'Result<Data, FourSquareError>' cannot be constructed because it has no accessible initializers

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

关于我为什么会收到此错误的任何想法?

提前致谢

'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))
        }
    }
}

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

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

或者

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM