Swift 错误无法读取数据,因为它丢失了
Swift Error The data can not be Read because it is missing
我正在尝试显示来自 API 的数据。这是 API Link .https://coinmap.org/api/v1/venues/ 。我想将 Vanues 数组字段的属性显示到 IOS app 中。我使用 Quick type 创建了模型。我使用像 self.vanues = respone.results.map{$0} 这样的地图,但结果仍然相同 这是模型。
import Foundation
// MARK: - Welcome
struct Coin: Codable {
let venues: [Venue]
}
// MARK: - Venue
struct Venue: Codable {
let id: Int
let lat, lon: Double
let category, name: String
let createdOn: Int
let geolocationDegrees: String
enum CodingKeys: String, CodingKey {
case id, lat, lon, category, name
case createdOn = "created_on"
case geolocationDegrees = "geolocation_degrees"
}
}
我使用另一个 swift 文件将其转换为列表。这是代码。
import Foundation
struct VanueResponse: Decodable {
let results: [Venue]
}
这是我的网络管理员。
import Foundation
class NetworkManager {
func getCoins(from url: String, completion: @escaping (Result<VanueResponse, NetworkError>) -> Void ) {
guard let url = URL(string: url) else {
completion(.failure(.badURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(.other(error)))
return
}
if let data = data {
//decode
do {
let response = try JSONDecoder().decode(VanueResponse.self, from: data)
completion(.success(response))
} catch let error {
completion(.failure(.other(error)))
}
}
}
.resume()
}
}
这里是主持人class。
import Foundation
class VenuePresenter : VanueProtocol{
// creating instance of the class
private let view : VanueViewProtocol
private let networkManager: NetworkManager
private var vanues = [Venue]()
var rows: Int{
return vanues.count
}
// initilanize the class
init(view:VanueViewProtocol , networkmanager:NetworkManager = NetworkManager()){
self.view = view
self.networkManager = networkmanager
}
func getVanue(){
let url = "https://coinmap.org/api/v1/venues/"
networkManager.getCoins(from: url) { result in
switch result {
case.success(let respone):
self.vanues = respone.results
DispatchQueue.main.async {
self.view.resfreshTableView()
}
case .failure(let error):
DispatchQueue.main.async {
self.view.displayError(error.localizedDescription)
print(Thread.callStackSymbols)
}
}
}
}
func getId(by row: Int) -> Int {
return vanues[row].id
}
func getLat(by row: Int) -> Double {
return vanues[row].lat
}
func getCreated(by row: Int) -> Int {
return vanues[row].createdOn
}
func getLon(by row: Int) -> Double? {
return vanues[row].lon
}
}
我设置断点并在控制台中找到它 windows .
这是我 运行 应用程序时的屏幕截图。
解码错误很明显:
根字典中的键是 venues
(不是 results
)所以正确的结构是 Coin
.
在 getCoins
中用 Coin
替换两个出现的 VanueResponse
我正在尝试显示来自 API 的数据。这是 API Link .https://coinmap.org/api/v1/venues/ 。我想将 Vanues 数组字段的属性显示到 IOS app 中。我使用 Quick type 创建了模型。我使用像 self.vanues = respone.results.map{$0} 这样的地图,但结果仍然相同 这是模型。
import Foundation
// MARK: - Welcome
struct Coin: Codable {
let venues: [Venue]
}
// MARK: - Venue
struct Venue: Codable {
let id: Int
let lat, lon: Double
let category, name: String
let createdOn: Int
let geolocationDegrees: String
enum CodingKeys: String, CodingKey {
case id, lat, lon, category, name
case createdOn = "created_on"
case geolocationDegrees = "geolocation_degrees"
}
}
我使用另一个 swift 文件将其转换为列表。这是代码。
import Foundation
struct VanueResponse: Decodable {
let results: [Venue]
}
这是我的网络管理员。
import Foundation
class NetworkManager {
func getCoins(from url: String, completion: @escaping (Result<VanueResponse, NetworkError>) -> Void ) {
guard let url = URL(string: url) else {
completion(.failure(.badURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(.other(error)))
return
}
if let data = data {
//decode
do {
let response = try JSONDecoder().decode(VanueResponse.self, from: data)
completion(.success(response))
} catch let error {
completion(.failure(.other(error)))
}
}
}
.resume()
}
}
这里是主持人class。
import Foundation
class VenuePresenter : VanueProtocol{
// creating instance of the class
private let view : VanueViewProtocol
private let networkManager: NetworkManager
private var vanues = [Venue]()
var rows: Int{
return vanues.count
}
// initilanize the class
init(view:VanueViewProtocol , networkmanager:NetworkManager = NetworkManager()){
self.view = view
self.networkManager = networkmanager
}
func getVanue(){
let url = "https://coinmap.org/api/v1/venues/"
networkManager.getCoins(from: url) { result in
switch result {
case.success(let respone):
self.vanues = respone.results
DispatchQueue.main.async {
self.view.resfreshTableView()
}
case .failure(let error):
DispatchQueue.main.async {
self.view.displayError(error.localizedDescription)
print(Thread.callStackSymbols)
}
}
}
}
func getId(by row: Int) -> Int {
return vanues[row].id
}
func getLat(by row: Int) -> Double {
return vanues[row].lat
}
func getCreated(by row: Int) -> Int {
return vanues[row].createdOn
}
func getLon(by row: Int) -> Double? {
return vanues[row].lon
}
}
我设置断点并在控制台中找到它 windows .
这是我 运行 应用程序时的屏幕截图。
解码错误很明显:
根字典中的键是 venues
(不是 results
)所以正确的结构是 Coin
.
在 getCoins
中用 Coin
VanueResponse