我正在尝试从 swift 5 中的 api 获取一些数据
我收到此错误
Member 'success' in 'Result<[Suggestion], SuggestionError>' produces result of type 'Result', but context expects 'Result<[Suggestion],
这个函数给我带来了问题。如果我评论给我带来麻烦的行,它会打印 canNotProcessData
func getSuggestions (completion: @escaping(Result<[Suggestion], SuggestionError>) -> Void){
let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, response, error in
guard let jsonData = data else{
completion(.failure(.noDataAvailable))
return
}
print(response!)
do{
let decoder = JSONDecoder()
let suggestionReponse = try decoder.decode(Suggestion.self, from: jsonData)
let suggestions = suggestionReponse
completion(.success(Suggestion))
}catch{
completion(.failure(.canNotProcessData))
}
}
dataTask.resume()
}
这是我的建议结构
struct Suggestion:Decodable{
var id: Int
var hometeam: String
var awayteam: String
var hometeamLogo: String
var awayteamLogo: String
var bet: String
var value: Double
var stake: Int
var bookieOdds: Double
}
这是我从 api 收到的示例
[
{
"id": 132,
"hometeam": "Afjet Afyonspor",
"awayteam": "Sancaktepe Belediyespor",
"hometeamLogo": "https://media.api-football.com/teams/3565.png",
"awayteamLogo": "https://media.api-football.com/teams/3604.png",
"bet": "2",
"value": 1.19,
"stake": 1,
"bookieOdds": 2.55
},
{
"id": 152,
"hometeam": "Bolívar",
"awayteam": "Blooming",
"hometeamLogo": "https://media.api-football.com/teams/3702.png",
"awayteamLogo": "https://media.api-football.com/teams/3701.png",
"bet": "2",
"value": 3.18,
"stake": 1,
"bookieOdds": 11
}
]
最佳答案
您应该更好地准确地显示整个消息:
Member 'success' in 'Result<[Suggestion], SuggestionError>' produces result of type 'Result<Success, Failure>', but context expects 'Result<[Suggestion], SuggestionError>'
这显然是错误的,因为您在此处传递类型名称:
completion(.success(Suggestion))
但是在这行之前,你有一件事错了:
let suggestionReponse = try decoder.decode(Suggestion.self, from: jsonData)
JSON 响应的最外层结构是一个数组 ([
... ]
),您需要将其解码为 Array
建议
,而不是建议
:
请尝试这样的事情:
func getSuggestions(completion: @escaping(Result<[Suggestion], SuggestionError>) -> Void){
let dataTask = URLSession.shared.dataTask(with: resourceURL) { data, response, error in
guard let jsonData = data else{
completion(.failure(.noDataAvailable))
return
}
print(response!)
do{
let decoder = JSONDecoder()
//### Use `[Suggestion].self`, not `Suggestion.self`
let suggestions = try decoder.decode([Suggestion].self, from: jsonData)
completion(.success(suggestions)) //###Use the response, not the type name
} catch {
print(error) //### This gives you some hints on how to solve the error cases
completion(.failure(.canNotProcessData))
}
}
dataTask.resume()
}
关于json - 快速获取 Json 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231606/