From 8bb9f744ed0892c23ab862db84aa17955f67361b Mon Sep 17 00:00:00 2001 From: Cmurphy2000 <64995887+Cmurphy2000@users.noreply.github.com> Date: Tue, 12 May 2020 23:45:20 -0400 Subject: [PATCH 1/2] Did the work --- AirportDepartures.playground/Contents.swift | 145 ++++++++++++++---- .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 10568 bytes 4 files changed, 133 insertions(+), 27 deletions(-) create mode 100644 AirportDepartures.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 AirportDepartures.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AirportDepartures.playground/playground.xcworkspace/xcuserdata/clee.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/AirportDepartures.playground/Contents.swift b/AirportDepartures.playground/Contents.swift index 98e2131..efbbc0d 100644 --- a/AirportDepartures.playground/Contents.swift +++ b/AirportDepartures.playground/Contents.swift @@ -16,9 +16,76 @@ import UIKit //: e. Use a `String?` for the Terminal, since it may not be set yet (i.e.: waiting to arrive on time) //: //: f. Use a class to represent a `DepartureBoard` with a list of departure flights, and the current airport - - - +enum FlightStatus: String { +case enRoute = "En Route" +case scheduled = "Scheduled" +case canceled = "Canceled" +case boarding = "Boarding" +case delayed = "Delayed" +case landed = "Landed" +} + +struct AirportDestination { +var location: String +} + +struct Flight { +var destination: AirportDestination +var departureTime: Date? +var flightNumber: String +var terminal: String? +var airline: String +var status: FlightStatus.RawValue +} + + +class DepartureBoard { +var currentFlights: [Flight] +var currentAirport: String + +init (currentFlights: [Flight], currentAirport: String) { + self.currentFlights = currentFlights + self.currentAirport = currentAirport +} +func addFlights() { + currentFlights.append(contentsOf: flights) + } + +func statusAlert() { + for flight in currentFlights + { + switch flight.status { + case "Canceled": + print("We're sorry your flight to \(flight.destination.location) was canceled, here is a $500 voucher") + case "Scheduled": + var alert: String = "Your flight to \(flight.destination.location) is scheduled to" + if let unwrappedDepartureTime = flight.departureTime { + alert += " depart at \(unwrappedDepartureTime)" + } else { + alert += " depart at TBD" + } + if let unwrappedTerminal = flight.terminal { + alert += " from terminal \(unwrappedTerminal)" + } else { + alert += " from terminal TBD" + } + print(alert) + case "Boarding": + if let unwrappedTerminal = flight.terminal { + print("Your flight is boarding, please head to terminal: \(unwrappedTerminal) immediately. The doors are closing soon.") + } + case "En Route": + print("Your flight is currently En Route.") + case "Delayed": + print("Your flight has been delayed.") + case "Landed": + print("Your flight has landed.") + default: + break + } + } +} +} //: ## 2. Create 3 flights and add them to a departure board //: a. For the departure time, use `Date()` for the current time //: @@ -29,8 +96,18 @@ import UIKit //: d. Make one of the flights have a `nil` terminal because it has not been decided yet. //: //: e. Stretch: Look at the API for [`DateComponents`](https://developer.apple.com/documentation/foundation/datecomponents?language=objc) for creating a specific time +let board = DepartureBoard(currentFlights: [], currentAirport: "JFK Airport") + + +let spainFlight = Flight(destination: AirportDestination(location: "Port of Spain"), departureTime: Date(), flightNumber: "BW551", terminal: "4", airline: "Carribean Airlines", status: "Scheduled") + +let tokyoFlight = Flight(destination: AirportDestination(location: "Tokyo, Japan"), departureTime: Date(), flightNumber: "JL3", terminal: "1", airline: "JAL", status: "Canceled") +let koreaFlight = Flight(destination: AirportDestination(location: "Seoul, Korea"), departureTime: Date(), flightNumber: "KE250", terminal: nil, airline: "Korean Air", status: "En Route") +let flights = [spainFlight, tokyoFlight, koreaFlight] + +board.addFlights() //: ## 3. Create a free-standing function that can print the flight information from the `DepartureBoard` //: a. Use the function signature: `printDepartures(departureBoard:)` @@ -40,8 +117,13 @@ import UIKit //: c. Make your `FlightStatus` enum conform to `String` so you can print the `rawValue` String values from the `enum`. See the [enum documentation](https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html). //: //: d. Print out the current DepartureBoard you created using the function +func printDepartures(departureBoard: DepartureBoard) { +for flight in flights { + print(flight) +} +} - +printDepartures(departureBoard: board) //: ## 4. Make a second function to print print an empty string if the `departureTime` is nil @@ -58,26 +140,28 @@ import UIKit //: Destination: Los Angeles Airline: Delta Air Lines Flight: KL 6966 Departure Time: Terminal: 4 Status: Canceled //: Destination: Rochester Airline: Jet Blue Airways Flight: B6 586 Departure Time: 1:26 PM Terminal: Status: Scheduled //: Destination: Boston Airline: KLM Flight: KL 6966 Departure Time: 1:26 PM Terminal: 4 Status: Scheduled - - - -//: ## 5. Add an instance method to your `DepatureBoard` class (above) that can send an alert message to all passengers about their upcoming flight. Loop through the flights and use a `switch` on the flight status variable. -//: a. If the flight is canceled print out: "We're sorry your flight to \(city) was canceled, here is a $500 voucher" -//: -//: b. If the flight is scheduled print out: "Your flight to \(city) is scheduled to depart at \(time) from terminal: \(terminal)" -//: -//: c. If their flight is boarding print out: "Your flight is boarding, please head to terminal: \(terminal) immediately. The doors are closing soon." -//: -//: d. If the `departureTime` or `terminal` are optional, use "TBD" instead of a blank String -//: -//: e. If you have any other cases to handle please print out appropriate messages -//: -//: d. Call the `alertPassengers()` function on your `DepartureBoard` object below -//: -//: f. Stretch: Display a custom message if the `terminal` is `nil`, tell the traveler to see the nearest information desk for more details. - - - +//func statusAlert(departureBoard: DepartureBoard) { +// for flight in flights { +// switch flight.status { +// case "Canceled": +// print("We're sorry your flight to (city) was canceled, here is a $500 voucher") +// case "Scheduled": +// print("Your flight to (city) is scheduled to depart at (time) from terminal: (terminal)") +// case "Boarding": +// print("Your flight is boarding, please head to terminal: (terminal) immediately. The doors are closing soon.") +// case "En Route": +// print("Your flight is currently En Route.") +// case "Delayed": +// print("Your flight has been delayed.") +// case "Landed": +// print("Your flight has landed.") +// default: +// break +// } +// } +//} + +board.statusAlert() //: ## 6. Create a free-standing function to calculate your total airfair for checked bags and destination //: Use the method signature, and return the airfare as a `Double` @@ -96,6 +180,13 @@ import UIKit //: e. Make sure to cast the numbers to the appropriate types so you calculate the correct airfare //: //: f. Stretch: Use a [`NumberFormatter`](https://developer.apple.com/documentation/foundation/numberformatter) with the `currencyStyle` to format the amount in US dollars. - - - +func calculateAirfare(checkedBags: Int, distance: Double, travelers: Int) -> Double { + let ticketPrice = Double(distance) * 0.10 + let bagPrice = checkedBags * 25 + let totalCost: Double = (ticketPrice * Double(travelers)) + Double(bagPrice) + return totalCost +} + +calculateAirfare(checkedBags: 3, distance: 1000.0, travelers: 3) +calculateAirfare(checkedBags: 6, distance: 2534.23, travelers: 6) +calculateAirfare(checkedBags: 2, distance: 3000.45, travelers: 2) diff --git a/AirportDepartures.playground/playground.xcworkspace/contents.xcworkspacedata b/AirportDepartures.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/AirportDepartures.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AirportDepartures.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AirportDepartures.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AirportDepartures.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AirportDepartures.playground/playground.xcworkspace/xcuserdata/clee.xcuserdatad/UserInterfaceState.xcuserstate b/AirportDepartures.playground/playground.xcworkspace/xcuserdata/clee.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ec3ce1832139692a70a7b3a1c67fa4e05d058907 GIT binary patch literal 10568 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 literal 0 HcmV?d00001 From 6f45e8d024d9b1fb4b67752998b76ff1429d1e31 Mon Sep 17 00:00:00 2001 From: Cmurphy2000 <64995887+Cmurphy2000@users.noreply.github.com> Date: Wed, 13 May 2020 17:03:07 -0400 Subject: [PATCH 2/2] Fixed step 4 @PercivalN --- AirportDepartures.playground/Contents.swift | 41 +++++++----------- .../UserInterfaceState.xcuserstate | Bin 10568 -> 10750 bytes 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/AirportDepartures.playground/Contents.swift b/AirportDepartures.playground/Contents.swift index efbbc0d..77c3a69 100644 --- a/AirportDepartures.playground/Contents.swift +++ b/AirportDepartures.playground/Contents.swift @@ -101,7 +101,7 @@ let board = DepartureBoard(currentFlights: [], currentAirport: "JFK Airport") let spainFlight = Flight(destination: AirportDestination(location: "Port of Spain"), departureTime: Date(), flightNumber: "BW551", terminal: "4", airline: "Carribean Airlines", status: "Scheduled") -let tokyoFlight = Flight(destination: AirportDestination(location: "Tokyo, Japan"), departureTime: Date(), flightNumber: "JL3", terminal: "1", airline: "JAL", status: "Canceled") +let tokyoFlight = Flight(destination: AirportDestination(location: "Tokyo, Japan"), departureTime: nil, flightNumber: "JL3", terminal: "1", airline: "JAL", status: "Canceled") let koreaFlight = Flight(destination: AirportDestination(location: "Seoul, Korea"), departureTime: Date(), flightNumber: "KE250", terminal: nil, airline: "Korean Air", status: "En Route") @@ -118,8 +118,10 @@ board.addFlights() //: //: d. Print out the current DepartureBoard you created using the function func printDepartures(departureBoard: DepartureBoard) { -for flight in flights { - print(flight) + for flight in departureBoard.currentFlights { + if let unwrappedDeparture = flight.departureTime, let unwrappedTerminal = flight.terminal { + print("Destination: \(flight.destination.location), Airline: \(flight.airline), Flight: \(flight.flightNumber), Departure Time: \(unwrappedDeparture), Terminal: \(unwrappedTerminal), Status: \(flight.status)") + } } } @@ -140,28 +142,17 @@ printDepartures(departureBoard: board) //: Destination: Los Angeles Airline: Delta Air Lines Flight: KL 6966 Departure Time: Terminal: 4 Status: Canceled //: Destination: Rochester Airline: Jet Blue Airways Flight: B6 586 Departure Time: 1:26 PM Terminal: Status: Scheduled //: Destination: Boston Airline: KLM Flight: KL 6966 Departure Time: 1:26 PM Terminal: 4 Status: Scheduled -//func statusAlert(departureBoard: DepartureBoard) { -// for flight in flights { -// switch flight.status { -// case "Canceled": -// print("We're sorry your flight to (city) was canceled, here is a $500 voucher") -// case "Scheduled": -// print("Your flight to (city) is scheduled to depart at (time) from terminal: (terminal)") -// case "Boarding": -// print("Your flight is boarding, please head to terminal: (terminal) immediately. The doors are closing soon.") -// case "En Route": -// print("Your flight is currently En Route.") -// case "Delayed": -// print("Your flight has been delayed.") -// case "Landed": -// print("Your flight has landed.") -// default: -// break -// } -// } -//} - -board.statusAlert() +func printDepartures2(departureBoard: DepartureBoard) { + for flight in departureBoard.currentFlights { +// let emptyString: String = "" + if let unwrappedDeparture = flight.departureTime { + print("\(unwrappedDeparture)") + } +} +} + + printDepartures2(departureBoard: board) + board.statusAlert() //: ## 6. Create a free-standing function to calculate your total airfair for checked bags and destination //: Use the method signature, and return the airfare as a `Double` diff --git a/AirportDepartures.playground/playground.xcworkspace/xcuserdata/clee.xcuserdatad/UserInterfaceState.xcuserstate b/AirportDepartures.playground/playground.xcworkspace/xcuserdata/clee.xcuserdatad/UserInterfaceState.xcuserstate index ec3ce1832139692a70a7b3a1c67fa4e05d058907..941fa3414dd00714359e03f56241106ec5714208 100644 GIT binary patch delta 4070 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 G(SHC>TeK4Z