ultraflex
ultraflex

Reputation: 163

More Functional / Swift way to convert time to minutes

I'm trying to convert a length of time in "Hours:Minutes" to "minutes". Time is given as a String, and I want to return a Double of minutes.

Currently I'm using the following function:

func convertMinHoursToDouble(length: String) -> Double {
var hours = 0.0
var minutes = 0.0

let lengthCleaned = length.stringByReplacingOccurrencesOfString(":", withString: "")

var count = 0
for char in lengthCleaned.characters {
  if count == 0 {
    hours = Double("\(char)")! * 60
  } else if count == 1 {
    minutes = Double("\(char)")! * 10
  } else if count == 2 {
    minutes = Double("\(char)")! + minutes
  }
  ++count
 }
return hours+minutes
}

let time = "2:16"
let convertedTime = convertMinHoursToDouble(time)
print(convertedTime) // prints 136.0

This works, however I'm trying to do this in a more functional / Swift way. How can it be done with the reduce function. This is the closest I can get to the solution.

let convertedTime = time.characters.reduce(0) { (dub, char) in dub + Double(String(char))!  }

Upvotes: 1

Views: 91

Answers (2)

Cristik
Cristik

Reputation: 32904

Functional solution:

func convertMinHoursToDouble(time: String) -> Int {
    let timeComps = (time as NSString).componentsSeparatedByString(":") as [NSString]
    return timeComps.reduce(0) { acc, item in
        acc * 60 + item.integerValue
    }
}

let time = "02:15"
let convertedTime = convertMinHoursToDouble(time)
print(convertedTime)

You split the string into components, and reduce on that array. This works like a charm also for strings like "03:24:34" for which it computes the time in seconds.

You can add additional validation logic if you want to deal with malformed strings: no ":", more than one ":", invalid minutes value (e.g. 78), etc.

Upvotes: 4

ebluehands
ebluehands

Reputation: 286

The pure Swift way would be :

let time = "02:16"

let converted = time.characters.split(":")
    .flatMap { Int(String($0)) }
    .reduce(0) {  $0 * 60 + $1 }

print(converted) //"136\n"

Upvotes: 4

Related Questions