【发布时间】: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))
}
}
}
【问题讨论】: