ContentView.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | // // ContentView.swift // SwiftUIProject // // Created by Cairocoders // import SwiftUI struct ContentView: View { @ObservedObject var viewModel = ContentViewModel() var body: some View { NavigationView { VStack { List(viewModel.items, id: \.id) { item in VStack(alignment: .leading) { Text(item.title) Text(item.completed.description) .font(. system (size: 11)) .foregroundColor(.gray) } } .listStyle(GroupedListStyle()) }.onAppear(perform: { viewModel.fetchData() }) .navigationBarTitle( "Fetch JSON Datas" ) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // // ViewModel.swift // SwiftUIProject // // Created by Cairocoders // import SwiftUI class ContentViewModel: ObservableObject { @Published var items = [Model]() func fetchData() { guard let url = URL(string: api) else { return } URLSession.shared.dataTask(with: url) { (data, response, error) in do { if let data = data { let result = try JSONDecoder().decode([Model].self, from: data) DispatchQueue.main.async { self.items = result } } else { print( "No data" ) } } catch (let error) { print(error.localizedDescription) } }.resume() } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // // Model.swift // SwiftUIProject // // Created by Cairocoders // import SwiftUI struct Model: Decodable { let id: Int let userId: Int let title: String let completed: Bool } |