Я пытаюсь вызвать API, и когда я передаю значение в переменную результата, это дает мне ошибку. Я также получаю эту ошибку в забавной функции c mapError, приведенной ниже.
Есть идеи, почему я получаю эту ошибку?
Заранее спасибо
' Результат [Data, FourSquareError] 'не может быть создан, потому что у него нет доступных инициализаторов
' Результат [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))
}
}
}