#json #swift #dictionary #parsing #swiftui
Вопрос:
Я проанализировал данные из файла json, но я не знаю, как получить эти переменные. Нужен код, имя и значение. Мне нужно отобразить их в таблице с помощью swiftui. У меня беспорядок в консоли, и я не знаю, как получить эти данные
это структура
import Foundation
struct CurrencyModel: Codable {
let valute: [String : Valute]
enum CodingKeys: String, CodingKey {
case valute = "Valute"
}
}
struct Valute: Codable {
let charCode, name: String
let value: Double
enum CodingKeys: String, CodingKey {
case charCode = "CharCode"
case name = "Name"
case value = "Value"
}
}
а это парсер
class FetchDataVM: ObservableObject {
var valueData = [String : Any]()
init() {
fetchCurrency()
}
func fetchCurrency() {
let urlString = "https://www.cbr-xml-daily.ru/daily_json.js"
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) {data, _, error in
DispatchQueue.main.async {
if let data = data {
do {
let decoder = JSONDecoder()
let decodedData = try decoder.decode(CurrencyModel.self, from: data)
print(decodedData)
} catch {
print("Error! Something went wrong.")
}
}
}
}.resume()
}
}
Ответ №1:
Поскольку вся необходимая информация содержится в Valute
структуре, вам нужны только значения valute
словаря. Заменять
var valueData = [String : Any]()
с
@Published var valueData = [Valute]()
и после строки print(decodedData)
вставить
self.valueData = decodedData.valute.values.sorted{$0.name < $1.name}
или
self.valueData = decodedData.valute.values.sorted{$0.charCode < $1.charCode}
В представлении вы можете выполнить итерацию массива просто с ForEach
помощью выражения
Комментарии:
1. Также используйте оболочку свойств @Published для
valueData
обновления представления после установки свойства2. Большое спасибо! Сейчас я проверю. Ты лучший