Hello guys, on parsing Json in SwiftUI question:
I parse data from remote Json and give it to output in console. In this step is very good.
How I can "insert" read this data field on my ContentView?.. I'm stuck on this....
Please help! or give me suggest tutorial, where is detailed about this.
Thanks!
I got error
Value of type 'UserResults' has no member 'email'
on Text(ppl?.email ?? "Email Placeholder") string
ContentView file:
import SwiftUI
struct ContentView: View {
@State private var ppl: UserResults?
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Text(ppl?.email ?? "Email Placeholder")
}
.onAppear {
NetworkServiceWithCompletions.shared
.fetchData { result in
switch result {
case .success(let usersData):
print("Data:\(usersData.results[0].email)")
case .failure(let failure):
print(failure.localizedDescription)
}
}
}
.padding()
}
}
#Preview {
ContentView()
}
User file
import Foundation
struct UserResults: Decodable {
let results: [User]
struct User: Decodable {
var gender: String
var name: Name
var email: String
var picture: Picture
struct Name: Decodable {
var title: String
var first: String
var last: String
}
struct Picture: Decodable {
var large: String
}
}
}
NetworkServiceWithCompletions file
import Foundation
class NetworkServiceWithCompletions: ObservableObject {
static let shared = NetworkServiceWithCompletions(); private init() { }
private func createURL() -> URL? {
let tunnel = "https://"
let server = "randomuser.me"
let endpoint = "/api"
let getParams = ""
let urlStr = tunnel + server + endpoint + getParams
let url = URL(string: urlStr)
return url
}
func fetchData(completion: @escaping (Result<UserResults, Error>) -> ()) {
guard let url = createURL() else {
completion(.failure(NetworkingError.badUrl))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data else {
if let error {
completion(.failure(error))
}
return
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let usersData = try decoder.decode(UserResults.self, from: data)
completion(.success(usersData))
} catch {
completion(.failure(NetworkingError.invalidData))
}
}.resume()
}
}
enum NetworkingError: Error {
case badUrl, badRewuest, badResponse, invalidData
}
I got error
Value of type 'UserResults' has no member 'email'
on Text(ppl?.email ?? "Email Placeholder") string