Это текущий код SWIFTUI, который у меня есть:
import SwiftUI
struct Holidays: Decodable {
var date: String
var localName: String
var name: String
var countryCode: String
}
struct HolidaysView: View {
@State private var holidays = [Holidays]()
var body: some View {
NavigationView {
List(holidays, id: \.name) { t in
VStack(alignment: .leading) {
Text(t.date)
.font(.headline)
.foregroundColor(.cyan)
Text(t.name)
.font(.body)
.foregroundColor(.indigo)
Text(t.countryCode)
.font(.body)
.foregroundColor(.red)
}
}
.navigationTitle("Holidays List")
.task {
await fetchHolidaysData()
}
}
}
func fetchHolidaysData() async {
// create the URL
guard let url = URL(string: "https://date.nager.at/api/v2/publicholidays/2020/US") else {
print("THIS URL DOES NOT WORK!")
return
}
// fetch the data
do {
let (data, _) = try await URLSession.shared.data(from: url)
// decode that data
if let decodedResponse = try? JSONDecoder().decode([Holidays].self, from: data) {
holidays = decodedResponse
}
} catch {
print("This data is not valid")
}
}
}
struct HolidaysView_Previews: PreviewProvider {
static var previews: some View {
HolidaysView()
}
}
Цель этого кода — предоставить возможность просматривать данные json с помощью URL-адреса. Когда я нажимаю заголовок навигации «Список праздников», данные не отображаются (в представлении содержимого). Я пробовал другие ссылки API, такие как заполнители API для JSON, и они сработали. Я не могу понять проблему или разницу. Я тоже попробовал ИИ. Я не знаю, что делаю не так. Может ли быть так, что мне придется использовать все переменные данных API? Или, возможно, идентификатор? Другие API, которые я использовал, имели идентификаторы для каждого раздела данных, поэтому я добавил
List(holidays, id: \.name) { t in ```
as
List(todos, id: \.id) { t in ```
```, could this be a possible reason?
ваш код с предложением @Larme try у меня хорошо работает. Обратите внимание, что для работы List необходимо убедиться, что элементы уникальны. Для этого я рекомендую создать праздники Identifiable, например struct Holidays: Identifiable, Decodable { let id = UUID()... Тогда вы можете использовать List(holidays) ...
@workingdogsupportUkraine и Ларме, спасибо вам обоим огромное, это мне очень помогло!





Вот мой рабочий пример кода, который объединяет рекомендации из комментариев. Код позволяет достичь цели, как описано The goal of this code is to be able to view the json data using the URL
struct Holidays: Identifiable, Decodable { // <-- here
let id = UUID() // <-- here
var date: String
var localName: String
var name: String
var countryCode: String
enum CodingKeys: String, CodingKey {
case date, localName, name, countryCode // <-- here no id
}
}
// for testing
struct ContentView: View {
var body: some View {
HolidaysView()
}
}
struct HolidaysView: View {
@State private var holidays = [Holidays]()
var body: some View {
NavigationStack { // <-- here
List(holidays) { t in // <-- here
VStack(alignment: .leading) {
Text(t.date)
.font(.headline)
.foregroundColor(.cyan)
Text(t.name)
.font(.body)
.foregroundColor(.indigo)
Text(t.countryCode)
.font(.body)
.foregroundColor(.red)
}
}
.navigationTitle("Holidays List")
.task {
await fetchHolidaysData()
}
}
}
func fetchHolidaysData() async {
// create the URL
guard let url = URL(string: "https://date.nager.at/api/v2/publicholidays/2020/US") else {
print("THIS URL DOES NOT WORK!")
return
}
// fetch the data
do {
let (data, _) = try await URLSession.shared.data(from: url)
// decode that data
holidays = try JSONDecoder().decode([Holidays].self, from: data) // <-- here
} catch {
print("error: \(error)") // <-- here, important
}
}
}
print("This data is not valid")называется?holidays = decodedResponseназывается? Вам следует заменитьif let decodedResponse = try? JSONDecoder()наlet decodedResponse = try JSONDecoder()...и в подхватеprint("This data is not valid")->print("This data is not valid: \(error)"). В настоящее время, если есть ошибка в декодировании, вы просто заглушаете ее (с помощьюtry?, знак вопроса является глушителем), а с помощью отпечатка вы игнорируете обнаруженную ошибку, которая может сказать вам, почему это не удалось.