Dewasa ini, perkembangan teknologi pembuatan antar muka untuk platform apple (ios, iPadOs, MacOs) sudah semakin canggih. jika sebelumnya kita memakai UIKit / StoryBoard maka sekarang kita memiliki SwiftUI. SwiftUI memberikan kita kemudahan yang jauh lebih simple dari UI Builder sebelumnya, kita bisa membuat UI secara Programmatical / Deklaratif serta Drag & Drop.
Di kesempatan kali ini kita akan membuat sebuah aplikasi yang memuat daftar wisata yang berasal dari api milik Dicoding https://tourism-api.dicoding.dev/list
Seperti biasa mari buat project SwiftUI nya dan langsung saja kita buat kelas model nya seperti berikut:
struct PlacesResponse: Decodable { let places: [Place]}
struct Place: Decodable {
let id: Int
let name: String
let description: String
let address: String
let longitude: Double
let latitude: Double
let like: Int
let image: String
}
then, kita jadikan ContentView nya sebagai berikut.
struct ContentView: View {
@State var places = [Place]()
var body: some View {
List(places, id: \.id){ item in
VStack(alignment: .leading){
Text(item.name)
}
}
}
selanjutnya kita beri modifier onAppear pada Widget / Component List
.onAppear(perform: {
URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://tourism-api.dicoding.dev/list")!)){ data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(PlacesResponse.self, from: data){
DispatchQueue.main.async{
self.places = decodedResponse.places
}
return
}
}
}.resume()
})
}
maka kode akhir nya seperti berikut:
import SwiftUI
struct ContentView: View {
@State var places = [Place]()
var body: some View {
List(places, id: \.id){ item in
VStack(alignment: .leading){
Text(item.name)
}
}.onAppear(perform: {
URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://tourism-api.dicoding.dev/list")!)){ data, response, error in
if let data = data {
if let decodedResponse = try? JSONDecoder().decode(PlacesResponse.self, from: data){
DispatchQueue.main.async{
self.places = decodedResponse.places
}
return
}
}
}.resume()
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct PlacesResponse: Decodable {
let places: [Place]
}
struct Place: Decodable {
let id: Int
let name: String
let description: String
let address: String
let longitude: Double
let latitude: Double
let like: Int
let image: String
}
silahkan di run dan lihat hasilnya :)