DEV Community

Nathan Mattes
Nathan Mattes

Posted on • Originally published at zeitschlag.net on

100 Days of SwiftUI — Day 19

Today, at Day 19 was the challenge day — and it was great! Basically, you had to build a unit conversion-app from scratch. Paul gave some examples on units and some tips and tricks — and then you were on your own.

As I enjoyed going to pubs in the UK in pre-corona-times from time to time, I decided to find out, how much I drank in liters (or litres?!) when I had four (imperial) pints. It's 2.27l — that's quite a lot! 🍺🍺🍺🍺

And this is, what the app looks like. Not really pretty, but it get's the job done:

I learned, that there's a built-in unit conversion in Foundation called (NS)Measurement. I didn't expect that, but wow, that's great! So the code to convert pints into litres (or liters) is pretty straightforward:

var convertedAmount: Double? {
  guard let amount = Double(amount) else { return nil }

  let input = Measurement(value: amount, unit: units[inputUnitIndex].unit)
  let output = input.converted(to: units[outputUnitIndex].unit)

  return output.value
}

<!--kg-card-end: markdown--><!--kg-card-begin: markdown-->

units are an array of type: [(title: String, unit: UnitVolume)] so that I can show a nicer text in the pickers instead of only the symbol:

private let units: [(title: String, unit: UnitVolume)] = [
  (title: "Milliliters", unit: .milliliters),
  (title:"Liters", unit: .liters),
  (title: "Cups", unit: .cups),
  (title: "Pints", unit: .imperialPints),
  (title: "Gallons", unit: .imperialGallons),
]

I learned, that I can't use the fancy string formatting in string interpolation in computed variables, unfortunately. The SwiftUI itself is a Form with some Sections, nothing special.

I enjoyed today's task and again: I'm looking forward to tomorrow. Obviously, Paul knows how to motivate people. Thank you for that! Solving the challenge didn't take as much time as writing this blogpost ¯\_(ツ)_/¯

Top comments (1)

Collapse
 
carmenroxana profile image
CarmenRoxana

The Apple documentation is not helpful for a beginner like me. Could you elaborate for example how you knew that you need to return "output.value" instead of "output" and could you link to the documentation for units? Thanks!