我正在嘗試顯示來自 API 的資料。這是 API 鏈接。https://coinmap.org/api/v1/venues/。我想將 Vanues Array 欄位的屬性顯示到 IOS app 中。我使用快速型別創建模型。我使用類似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()
}
}
這是演示者類。
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
}
}
我放置斷點并在控制臺視窗中找到它。

這是我運行 Applications 時的螢屏截圖。

uj5u.com熱心網友回復:
解碼錯誤很明顯:
根字典中的鍵是venues(not results) 所以正確的結構是Coin.
在getCoins替換兩個出現的VanueResponsewithCoin
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/425807.html
