Skip to content

Commit

Permalink
Fetch airport models from json
Browse files Browse the repository at this point in the history
  • Loading branch information
Bruno Muniz Azevedo Filho committed Oct 3, 2023
1 parent 7d4a0f7 commit 8788955
Show file tree
Hide file tree
Showing 11 changed files with 73,390 additions and 108 deletions.
Binary file modified .DS_Store
Binary file not shown.
16 changes: 16 additions & 0 deletions Airports.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,17 @@
objects = {

/* Begin PBXBuildFile section */
32A1490B2ACBA30600D8E87A /* airports.json in Resources */ = {isa = PBXBuildFile; fileRef = 32A1490A2ACBA30600D8E87A /* airports.json */; };
32AB3B502ACA7C3E007C7528 /* AirportsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB3B4F2ACA7C3E007C7528 /* AirportsApp.swift */; };
32AB3B522ACA7C3E007C7528 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB3B512ACA7C3E007C7528 /* ContentView.swift */; };
32AB3B542ACA7C3E007C7528 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 32AB3B532ACA7C3E007C7528 /* Assets.xcassets */; };
32AB3B572ACA7C3E007C7528 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 32AB3B562ACA7C3E007C7528 /* Preview Assets.xcassets */; };
32AB3B612ACA7C3F007C7528 /* AirportsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB3B602ACA7C3F007C7528 /* AirportsTests.swift */; };
32AB3B6B2ACA7C3F007C7528 /* AirportsUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB3B6A2ACA7C3F007C7528 /* AirportsUITests.swift */; };
32AB3B6D2ACA7C3F007C7528 /* AirportsUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB3B6C2ACA7C3F007C7528 /* AirportsUITestsLaunchTests.swift */; };
32FABEC32ACA8530008CEFE0 /* Airport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FABEC22ACA8530008CEFE0 /* Airport.swift */; };
32FABEC72ACA8671008CEFE0 /* AirportListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FABEC62ACA8671008CEFE0 /* AirportListViewModel.swift */; };
32FABEC92ACA868C008CEFE0 /* AirportListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32FABEC82ACA868C008CEFE0 /* AirportListView.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand All @@ -34,6 +38,7 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
32A1490A2ACBA30600D8E87A /* airports.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = airports.json; sourceTree = "<group>"; };
32AB3B4C2ACA7C3E007C7528 /* Airports.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Airports.app; sourceTree = BUILT_PRODUCTS_DIR; };
32AB3B4F2ACA7C3E007C7528 /* AirportsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportsApp.swift; sourceTree = "<group>"; };
32AB3B512ACA7C3E007C7528 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
Expand All @@ -44,6 +49,9 @@
32AB3B662ACA7C3F007C7528 /* AirportsUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AirportsUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
32AB3B6A2ACA7C3F007C7528 /* AirportsUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportsUITests.swift; sourceTree = "<group>"; };
32AB3B6C2ACA7C3F007C7528 /* AirportsUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportsUITestsLaunchTests.swift; sourceTree = "<group>"; };
32FABEC22ACA8530008CEFE0 /* Airport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Airport.swift; sourceTree = "<group>"; };
32FABEC62ACA8671008CEFE0 /* AirportListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportListViewModel.swift; sourceTree = "<group>"; };
32FABEC82ACA868C008CEFE0 /* AirportListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AirportListView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -98,6 +106,10 @@
32AB3B512ACA7C3E007C7528 /* ContentView.swift */,
32AB3B532ACA7C3E007C7528 /* Assets.xcassets */,
32AB3B552ACA7C3E007C7528 /* Preview Content */,
32FABEC22ACA8530008CEFE0 /* Airport.swift */,
32FABEC62ACA8671008CEFE0 /* AirportListViewModel.swift */,
32A1490A2ACBA30600D8E87A /* airports.json */,
32FABEC82ACA868C008CEFE0 /* AirportListView.swift */,
);
path = Airports;
sourceTree = "<group>";
Expand Down Expand Up @@ -233,6 +245,7 @@
files = (
32AB3B572ACA7C3E007C7528 /* Preview Assets.xcassets in Resources */,
32AB3B542ACA7C3E007C7528 /* Assets.xcassets in Resources */,
32A1490B2ACBA30600D8E87A /* airports.json in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -257,7 +270,10 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
32FABEC32ACA8530008CEFE0 /* Airport.swift in Sources */,
32FABEC92ACA868C008CEFE0 /* AirportListView.swift in Sources */,
32AB3B522ACA7C3E007C7528 /* ContentView.swift in Sources */,
32FABEC72ACA8671008CEFE0 /* AirportListViewModel.swift in Sources */,
32AB3B502ACA7C3E007C7528 /* AirportsApp.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
16 changes: 16 additions & 0 deletions Airports/Airport.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
struct Airport: Codable, Identifiable {
let id: String
let lon: String?
let iso: String
let status: Int
let name: String
let continent: String
let type: String
let lat: String?
let size: String?

enum CodingKeys: String, CodingKey {
case id = "iata"
case lon, iso, status, name, continent, type, lat, size
}
}
32 changes: 32 additions & 0 deletions Airports/AirportListView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import SwiftUI

struct AirportListView: View {
@StateObject var viewModel = AirportListViewModel()

var body: some View {
NavigationView {
List(viewModel.airports) { airport in
NavigationLink {
Text(airport.id)
Text(airport.name)
Text(airport.continent)
if let lat = airport.lat {
Text(lat)
}
if let lon = airport.lon {
Text(lon)
}
} label: {
Text(airport.name)
}
}
.navigationTitle("Airports")
}
}
}

struct AirportListView_Previews: PreviewProvider {
static var previews: some View {
AirportListView()
}
}
24 changes: 24 additions & 0 deletions Airports/AirportListViewModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import Foundation

class AirportListViewModel: ObservableObject {
@Published var airports: [Airport] = []

init() {
loadAirports()
}

private func loadAirports() {
guard let url = Bundle.main.url(forResource: "airports", withExtension: "json") else {
print("Invalid filename/path.")
return
}

do {
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
self.airports = try decoder.decode([Airport].self, from: data)
} catch {
print("Error decoding the airport list: \(error)")
}
}
}
15 changes: 4 additions & 11 deletions Airports/AirportsApp.swift
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
//
// AirportsApp.swift
// Airports
//
// Created by Bruno Muniz on 10/2/23.
//

import SwiftUI

@main
struct AirportsApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
23 changes: 6 additions & 17 deletions Airports/ContentView.swift
Original file line number Diff line number Diff line change
@@ -1,24 +1,13 @@
//
// ContentView.swift
// Airports
//
// Created by Bruno Muniz on 10/2/23.
//

import SwiftUI

struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
var body: some View {
AirportListView()
}
}

#Preview {
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Loading

0 comments on commit 8788955

Please sign in to comment.