Hallo,
ich habe seit 10 Jahren nichts mehr in Xcode programmiert und wollte jetzt wieder damit anfangen. Ich wollte Wetterdaten von OpenWeatherMap empfangen, was aber nicht funktioniert hat. Deshalb habe ich nach einfachen Beispielen gesucht, um wieder in das Thema reinzukommen und bin auf dieses Video gestoßen:
youtube.com/watch?v=ERr0GXqILgc&t=514s
Das habe ich dann nachgebaut und bekomme aber immer den Fehler "Invalid data"
Hier der Code:
Alles anzeigen
ich habe seit 10 Jahren nichts mehr in Xcode programmiert und wollte jetzt wieder damit anfangen. Ich wollte Wetterdaten von OpenWeatherMap empfangen, was aber nicht funktioniert hat. Deshalb habe ich nach einfachen Beispielen gesucht, um wieder in das Thema reinzukommen und bin auf dieses Video gestoßen:
youtube.com/watch?v=ERr0GXqILgc&t=514s
Das habe ich dann nachgebaut und bekomme aber immer den Fehler "Invalid data"
Hier der Code:
Quellcode
- import SwiftUI
- // Standard View model
- struct ContentView: View {
- @State private var user: GithubUser?
- var body: some View {
- VStack(spacing: 20) {
- AsyncImage(url: URL(string: user?.avatarUrl ?? "")) { image in
- image
- .resizable()
- .aspectRatio(contentMode: .fit)
- .clipShape(Circle())
- }
- placeholder: {
- Circle()
- .foregroundColor(.secondary)
- }
- .frame(width: 120, height: 120)
- Text(user?.login ?? "Login Placeholder")
- .bold()
- .font(.title)
- Text(user?.bio ?? "Bio Placeholder")
- .padding()
- Spacer()
- }
- .padding()
- .task {
- do {
- user = try await getUser()
- }
- catch GHError.invalidURL {
- print("Invalid URL!")
- }
- catch GHError.invalidResponse {
- print("Invalid response!")
- }
- catch GHError.invalidData {
- print("Invalid data!")
- }
- catch {
- print("Unexpected error")
- }
- }
- }
- // Normally in another View file
- func getUser() async throws -> GithubUser {
- let endpoint = "https://api.github.com/users/USERNAME"
- guard let url = URL(string: endpoint) else {
- throw GHError.invalidURL
- }
- let (data, response) = try await URLSession.shared.data(from: url)
- guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
- throw GHError .invalidResponse
- }
- do {
- let decoder = JSONDecoder()
- decoder.keyDecodingStrategy = .convertFromSnakeCase
- return try decoder.decode(GithubUser.self, from: data)
- }
- catch {
- throw GHError.invalidData
- }
- }
- }
- // Enable the phone preview
- struct ContentView_Previews: PreviewProvider {
- static var previews: some View {
- ContentView()
- }
- }
- // Model object (normally in a separate Model file)
- struct GithubUser: Codable {
- let login: String
- let avatarUrl: String
- let bio: String
- }
- // Create the error objects
- enum GHError: Error {
- case invalidURL
- case invalidResponse
- case invalidData
- }