Ios 错误:';结果<;数据,FourSquareError>';无法构造,因为它没有可访问的初始值设定项
我试图调用API,当我将值传递给结果变量时,它会给我一个错误。我在下面的func mapError函数中也遇到了这个错误 知道我为什么会犯这个错误吗 提前谢谢 无法构造“Result[Data,FourSquareError]”,因为它没有可访问的初始值设定项 无法构造“Result[Data,E]”,因为它没有可访问的初始值设定项 错误在以下几行:Ios 错误:';结果<;数据,FourSquareError>';无法构造,因为它没有可访问的初始值设定项,ios,swift,rest,swift5,Ios,Swift,Rest,Swift5,我试图调用API,当我将值传递给结果变量时,它会给我一个错误。我在下面的func mapError函数中也遇到了这个错误 知道我为什么会犯这个错误吗 提前谢谢 无法构造“Result[Data,FourSquareError]”,因为它没有可访问的初始值设定项 无法构造“Result[Data,E]”,因为它没有可访问的初始值设定项 错误在以下几行: let result = Result<Data, FourSquareError>(value: data, error:
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-getviouses(纬度:双精度,经度:双精度,完成度:@escaping
(结果)->无效){
设参数=[
“ll”:“\(纬度),\(经度)”,
“意图”:“浏览”,
“半径”:“250”
]
guard let url=createURL(端点:“场馆/搜索”),参数:
参数)
否则{
完成(结果失败(.couldNotCreateURL))
返回
}
让task=URLSession.shared.dataTask(with:url){data,response,
错误
让translateError=error.map{FourSquareError.networkError($0)}
让结果=结果(值:数据,错误:
翻译错误)
//将数据解析为JSON
.flatMap{中的数据
做{
返回Result.success(尝试解析数据(data))
}抓住{
返回结果。失败(.unexpectedError(error))
}
}
//检查服务器错误
.flatMap{(json:json)->导致
做{
返回Result.success(尝试validateResponse(json:json))
}抓住{
返回结果。失败(.unexpectedError(error))
}
}
//提取场地
.flatMap{(json:json)->导致
做{
返回Result.success(尝试使用(json:json))
}抓住{
返回结果。失败(.unexpectedError(error))
}
}
完成(结果)
}
task.resume()
}
扩展结果{
公共函数映射错误(uTransform:(ErrorType)抛出->E)返回->结果{
切换自身{
成功案例(let value):
返回结果(值)
案例。失败(let错误):
返回结果(尝试转换(错误))
}
}
}
结果是一个枚举,因此您可以构造它。您只能通过以下两种情况之一实例化结果
实例:失败
或成功
。例如:
let result: Result<Data, FourSquareError> = .success(Data())
let result:result=.success(Data())
或
let result:result=.failure(FourSquareError.where)
我试图这么做,但又出现了另一个错误:无法根据成员“success”推断上下文基础。
。成功和失败都是如此。对此有何想法?使用此解决方案后,此问题似乎已得到解决<代码>扩展结果{init(value:value?,error:ErrorType?{if let error=error{self=.failure(error)}else if let value=value{self=.success(value)}else{fatalError(“无法创建结果”)}很难说清楚您的代码中有哪些缺陷。我发布的解决方案中的代码对我来说编译得很好。@Marcelo这是一个与原始问题完全不同的问题,但是,您需要在第一个flatMap闭包中指定返回类型:.flatMap{data->Result in
谢谢。我只需要在您提到的第一个flatMap中修复此错误。“Result”类型的值没有成员“flatMap”。知道吗?
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))
}
}
}
let result: Result<Data, FourSquareError> = .success(Data())
let result: Result<Data, FourSquareError> = .failure(FourSquareError.whatever)