ios - SwiftUI 应用程序的 API 调用
问题描述
我正在尝试在 SwiftUI for iOS 中制作一个简单的应用程序。我正在按照 YouTube 视频的说明进行操作,该视频展示了如何从 PokeAPI 进行 API 调用,以便在视图中显示口袋妖怪列表。我使每一步都等于视频中的每一步,但编译器在下面的代码中返回了类似这样的错误。
PokemonAPIList.swift
import Foundation
struct PokemonAPIList: Decodable {
var results: [PokemonListEntry]
}
struct PokemonListEntry: Decodable {
var name: String
var url: String
}
PokemonNetworkManager.swift
import Foundation
import SwiftUI
import Combine
class PokemonNetworkManager: ObservableObject {
var didChange = PassthroughSubject<PokemonNetworkManager, Never> ()
var pokemonList = PokemonAPIList(results: []) {
didSet {
didChange.send(self)
}
}
init() {
guard let url = URL(string: "https://pokeapi.co/api/v2/pokemon?limit=151") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
guard let data = data else { return }
let pokemonList = try! JSONDecoder().decode(PokemonAPIList.self, from: data)
DispatchQueue.main.async {
self.pokemonList = pokemonList
}
}.resume()
}
}
内容视图.swift
import SwiftUI
struct ContentView: View {
@State var networkingManager = PokemonNetworkManager()
var body: some View {
List(networkingManager.pokemonList.results.identified(by: \.url)) {pokemon in //HERE THE ERRORS
Text(pokemon.name)
.font(.largeTitle)
}
}
}
#if DEBUG
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
出现以下错误:
无法从上下文推断关键路径类型;考虑明确指定根类型
插入“<#Root#>”
“[PokemonListEntry]”类型的值没有“已识别”成员
我唯一更改的是将@BindableObject 更改为@ObservableObject,因为我在线阅读它不再受支持。
解决方案
你可以试试
import Foundation
import SwiftUI
import Combine
struct PokemonAPIList: Decodable {
var results: [PokemonListEntry]
}
struct PokemonListEntry: Decodable {
var name: String
var url: String
}
class PokemonNetworkManager: ObservableObject {
@Published var results = [PokemonListEntry]()
init() {
guard let url = URL(string: "https://pokeapi.co/api/v2/pokemon?limit=151") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
guard let data = data else { return }
let pokemonList = try! JSONDecoder().decode(PokemonAPIList.self, from: data)
DispatchQueue.main.async {
self.results = pokemonList.results
}
}.resume()
}
}
struct ContentView: View {
@ObservedObject var networkingManager = PokemonNetworkManager()
var body: some View {
List(networkingManager.results,id:\.name) {pokemon in
Text(pokemon.name)
.font(.largeTitle)
}
}
}
推荐阅读
- python - 当您知道列和行引用时如何更改数据框中的字段值
- javascript - 打开另一个下拉菜单时关闭
- javascript - 如何使用数据库输出从国际电话输入自动填充首选国家
- utf-8 - Jersey - @QueryParam 和字符编码
- java - 在java中将树结构转换为二维“网格”数组
- jquery - 实现类似stackoverflow的标签搜索栏的问题?
- typescript - NavCtrl 和 Click 的离子问题
- java - 我可以将 Java 中的日期作为 TYPED INTO excel 单元格获取吗?
- asp.net-core - Chrome 将带有 304 状态代码响应的请求报告为已取消
- ios - 将 UIImage 保存到 PhotoLibrary Swift 4.2 iOS 12