Last active
April 17, 2017 22:51
-
-
Save ahcode0919/1fe89fd01fb6e73bea0bf87c053316f7 to your computer and use it in GitHub Desktop.
Example of Measurements and Units in Swift 3.0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extension String { | |
func getDecimalDigits(includeDecimal: Bool = true) -> String { | |
let set = includeDecimal ? "1234567890.": "1234567890" | |
return self.components(separatedBy: CharacterSet(charactersIn: set).inverted).joined() | |
} | |
func lettersOnly() -> String { | |
let characterSet = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ").inverted | |
return self.components(separatedBy: characterSet).joined() | |
} | |
} | |
extension UnitLength { | |
private static let imperialUnitLengths: [UnitLength] = [.inches, .feet, .miles] | |
var isMetric: Bool { | |
return !UnitLength.imperialUnitLengths.contains(self) | |
} | |
} | |
func getUnitLength(from measurement: String) -> UnitLength? { | |
let formattedString = measurement.lettersOnly().lowercased() | |
//We are assuming that the input has been pre-processed and only contains the measurement unit | |
//with or without decimal digits. | |
switch formattedString { | |
case "mm", "millimeter", "millimeters": | |
return UnitLength.millimeters | |
case "cm", "centimeter", "centimeters": | |
return UnitLength.centimeters | |
case "m", "meter", "meters": | |
return UnitLength.meters | |
case "km", "kilometer", "kilometers": | |
return UnitLength.kilometers | |
case "in", "inch", "inches": | |
return UnitLength.inches | |
case "ft", "feet", "foot": | |
return UnitLength.feet | |
case "mi", "mile", "miles": | |
return UnitLength.miles | |
default: | |
return nil | |
} | |
} | |
func getMeasurement(from measurementString: String) -> Measurement<UnitLength>? { | |
guard let double = Double(measurementString.getDecimalDigits()), | |
let unit = getUnitLength(from: measurementString) else { | |
return nil | |
} | |
return Measurement(value: double, unit: unit) | |
} | |
if let measurement = getMeasurement(from: "5.2 miles"), | |
let measurement2 = getMeasurement(from: "6.45 miles") { | |
assert(measurement < measurement2) //true | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment